HTTP phân biệt giữa hai thuộc tính:
Idempotency được định nghĩa bởi thông số kỹ thuật như sau:
Các phương thức cũng có thể có thuộc tính " idempotence " trong đó (ngoài các vấn đề lỗi hoặc hết hạn), các tác dụng phụ của N> 0 yêu cầu giống hệt như đối với một yêu cầu. Các phương pháp GET
, HEAD
, PUT
và DELETE
chia sẻ khách sạn này. Ngoài ra, các phương pháp OPTIONS
và TRACE
KHÔNG NÊN có tác dụng phụ, và do đó vốn dĩ không có tác dụng.
Và an toàn:
Cụ thể, quy ước đã được thiết lập rằng GET
và HEAD
các phương pháp KHÔNG NÊN có ý nghĩa của việc thực hiện một hành động nào khác ngoài truy xuất. Những phương pháp này nên được coi là " an toàn ". Điều này cho phép các tác nhân người dùng đại diện cho các phương thức khác, như POST
, PUT
và DELETE
, theo một cách đặc biệt, để người dùng nhận thức được thực tế rằng một hành động có thể không an toàn đang được yêu cầu.
Đương nhiên, không thể đảm bảo rằng máy chủ không tạo ra tác dụng phụ do thực hiện GET
yêu cầu; trong thực tế, một số tài nguyên động coi đó là một tính năng. Sự khác biệt quan trọng ở đây là người dùng không yêu cầu các tác dụng phụ, do đó không thể chịu trách nhiệm cho họ.
Lưu ý rằng an toàn ngụ ý tính không ổn định: nếu một phương thức không có tác dụng phụ thì thực hiện nó nhiều lần sẽ mang lại hiệu quả phụ giống như thực hiện một lần, cụ thể là không có.
Điều này đặt các phương thức thành ba loại:
- an toàn (và do đó cũng idempotent):
GET
, HEAD
, OPTION
,TRACE
- idempotent nhưng không nhất thiết phải an toàn:
PUT
,DELETE
- không bình thường cũng không an toàn:
POST
PUT cần không có tác dụng phụ.
Điều đó là sai. PUT
là bình thường nhưng không an toàn. Các toàn bộ điểm của PUT
là phải có một tác dụng phụ, cụ thể là cập nhật một tài nguyên. Ý nghĩa của sự bình thường là việc cập nhật cùng một tài nguyên với cùng một nội dung nhiều lần sẽ có tác dụng tương tự như chỉ cập nhật một lần.
Lưu ý đoạn cuối trong phần về an toàn [nhấn mạnh của tôi]:
Đương nhiên, không thể đảm bảo rằng máy chủ không tạo ra tác dụng phụ do thực hiện GET
yêu cầu; trong thực tế, một số tài nguyên động coi đó là một tính năng. Sự khác biệt quan trọng ở đây là người dùng không yêu cầu các tác dụng phụ, do đó không thể chịu trách nhiệm cho họ .
Mặc dù câu này nói về GET
và an toàn, chúng ta có thể giả định rằng các tác giả cũng có nghĩa là áp dụng lý do tương tự PUT
và tính không minh bạch. IOW: PUT
chỉ nên có một hiệu ứng phụ hiển thị cho người dùng , cụ thể là cập nhật tài nguyên được đặt tên. Nó có thể có tác dụng phụ khác, nhưng người dùng không thể chịu trách nhiệm về chúng.
Ví dụ, thực tế PUT
là idempotent có nghĩa là tôi có thể thử lại thường xuyên như tôi muốn: thông số kỹ thuật đảm bảo rằng việc thực thi nó nhiều lần sẽ giống hệt như thực hiện nó một lần. Hoàn toàn hợp lệ để tạo ra một hồ sơ tồn đọng của các phiên bản cũ như là một tác dụng phụ của nhiều PUT
yêu cầu đó. Tuy nhiên, nếu, do kết quả của nhiều lần thử lại, cơ sở dữ liệu của bạn sẽ lấp đầy một bản tồn đọng của các bản sửa đổi cũ, đó không phải là vấn đề của tôi, đó là của bạn.
IOW: bạn được phép có nhiều tác dụng phụ như bạn muốn, nhưng
- nó phải nhìn vào người dùng như thể các yêu cầu của họ là bình thường
- bạn chịu trách nhiệm cho những tác dụng phụ đó, không phải người dùng