Safe = method chỉ đọc, không làm thay đổi trạng thái phía server (GET, HEAD, OPTIONS). Idempotent = gọi 1 lần hay N lần cho cùng kết quả trạng thái (GET, HEAD, PUT, DELETE, OPTIONS). Mọi method safe đều idempotent, ngược lại thì không.
| Method | Safe | Idempotent |
|---|---|---|
| GET / HEAD | có | có |
| PUT | không | có |
| DELETE | không | có |
| POST | không | không |
| PATCH | không | không (trừ khi tự thiết kế được) |
Hệ quả thực tế:
- Proxy, crawler, prefetch của trình duyệt được phép gọi GET tự do. Nếu đặt GET /orders/1/delete thì một con bot quét link cũng xoá sạch dữ liệu.
- Client và load balancer chỉ tự retry an toàn với method idempotent. POST bị timeout thì không biết server đã xử lý hay chưa — đó là lý do phải có idempotency key.
DELETE vẫn idempotent dù lần đầu trả 204 còn lần sau trả 404: idempotent nói về trạng thái cuối cùng của server, không phải về response giống hệt nhau.