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, PUTvà DELETEchia sẻ khách sạn này. Ngoài ra, các phương pháp OPTIONSvà 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 GETvà HEADcá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, PUTvà 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 GETyê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. PUTlà bình thường nhưng không an toàn. Các toàn bộ điểm của PUTlà 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 GETyê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ề GETvà 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ự PUTvà tính không minh bạch. IOW: PUTchỉ 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ế PUTlà 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 PUTyê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