HTTP semantics và caching
HTTP định nghĩa ý nghĩa của method, status, representation và precondition; cache chỉ an toàn khi key, freshness và privacy policy phản ánh đúng resource lẫn authorization.
Content-Type mô tả body trả về; Accept nói client có thể xử lý representation nào. Intermediary được phép cache/transform chỉ trong phạm vi semantics và policy.1. Message, representation và negotiation
Request/response gồm control data, headers và optional content. Server có thể chọn representation dựa trên Accept, ngôn ngữ hoặc encoding; nếu lựa chọn phụ thuộc request header thì Vary phải làm rõ thành phần của cache key. Đừng dùng URL giống nhau cho body có authorization khác nhau trong shared cache nếu policy không bảo vệ được.
2. Method semantics
| Property | Methods / meaning | Interview trap |
|---|---|---|
| Safe | GET, HEAD (và các safe method) | Safe không cấm logging/analytics; nó mô tả intended business effect |
| Idempotent | PUT, DELETE và safe methods | Lặp request có intended effect tương đương, không bắt buộc response bytes/status giống nhau |
| Command/create | POST | Không mặc định retry-safe; cần application idempotency nếu có side effect |
| Partial update | PATCH | Phải định nghĩa patch format, conflict và null semantics |
Idempotency theo HTTP không tự biến payment hoặc gửi email thành operation retry-safe. Client chỉ nên tự retry khi biết request chưa được áp dụng hoặc application có key/fingerprint và replay policy.
3. Status code là contract
201 Creatednên chỉ ra resource mới quaLocation;202 Acceptednghĩa là xử lý bất đồng bộ chưa hoàn tất;204 No Contentkhông có response body.401nghĩa là thiếu/không hợp lệ authentication và thường đi kèm challenge;403là đã nhận diện nhưng bị từ chối.409diễn tả state conflict;412là precondition thất bại;422dùng theo convention cho semantic validation;429là throttling và có thể kèmRetry-After.- Error body nên có stable machine code, safe message, trace ID và field violations; không leak stack trace, SQL hay token.
4. Conditional requests và lost update
ETag là validator; strong và weak ETag có độ chính xác khác nhau. If-None-Match hỗ trợ cache validation (thường trả 304), còn If-Match bảo vệ optimistic concurrency khi cập nhật. Last-Modified hữu ích nhưng kém chính xác khi nhiều thay đổi trong cùng một đơn vị thời gian.
GET /orders/42 ETag: "v17"
PUT /orders/42
If-Match: "v17" -> update only if version still matches
-> 412 when another writer produced v18
5. Freshness, privacy và cache directives
| Directive | Ý nghĩa vận hành |
|---|---|
max-age | Fresh trong số giây tại client; s-maxage có thể override cho shared cache. |
no-store | Không lưu response; phù hợp dữ liệu nhạy cảm nhưng không đồng nghĩa “không log”. |
no-cache | Được lưu nhưng phải revalidate trước khi dùng. |
private | Không cho shared cache dùng response; vẫn có thể cache ở browser. |
stale-while-revalidate/stale-if-error | Cho phép stale có giới hạn để giảm latency hoặc chịu outage, nếu product chấp nhận. |
Cache key phải bao gồm mọi request dimension ảnh hưởng representation, thường qua Vary. Authorization, cookie, tenant và personalized data là điểm phải review trước khi bật shared caching. Invalidation/tagging và TTL là trade-off consistency, không chỉ là performance switch.
6. HTTP/2 và HTTP/3
HTTP/2 multiplex nhiều stream và nén header nhưng các stream vẫn chia sẻ TCP connection, nên packet loss có thể tạo transport-level head-of-line. HTTP/3 chạy semantics HTTP trên QUIC, mỗi stream tránh HOL ở transport giữa các stream và hỗ trợ connection migration; application vẫn phải xử lý deadline, retry và ordering như cũ.