HTTP membedakan antara dua properti:
Idempotensi didefinisikan oleh spek sebagai berikut:
Metode juga dapat memiliki properti " idempotence " di mana (selain dari kesalahan atau masalah kedaluwarsa) efek samping dari N> 0 permintaan identik adalah sama seperti untuk satu permintaan. Metode GET, HEAD, PUTdan DELETEberbagi properti ini. Juga, metode OPTIONSdan TRACE TIDAK HARUS memiliki efek samping, dan karenanya inheren idempoten.
Dan keamanan:
Secara khusus, konvensi telah ditetapkan bahwa metode GETdan TIDAK HARUS memiliki signifikansi mengambil tindakan selain pengambilan. Metode-metode ini harus dianggap " aman ". Ini memungkinkan agen pengguna untuk mewakili metode lain, seperti , dan , dengan cara khusus, sehingga pengguna dibuat sadar akan fakta bahwa tindakan yang mungkin tidak aman sedang diminta.HEADPOSTPUTDELETE
Secara alami, tidak mungkin untuk memastikan bahwa server tidak menghasilkan efek samping sebagai akibat dari melakukan GETpermintaan; pada kenyataannya, beberapa sumber daya dinamis menganggap itu sebagai fitur. Perbedaan penting di sini adalah bahwa pengguna tidak meminta efek samping, sehingga tidak dapat dimintai pertanggungjawaban atas efek sampingnya.
Perhatikan bahwa keselamatan menyiratkan idempotensi: jika suatu metode tidak memiliki efek samping, maka melakukannya berkali-kali akan menghasilkan efek samping yang sama seperti melakukannya sekali, yaitu tidak ada.
Ini menempatkan metode ke dalam tiga kategori:
- aman (dan dengan demikian juga idempoten):
GET, HEAD, OPTION,TRACE
- idempoten tapi belum tentu aman:
PUT,DELETE
- tidak idempoten atau aman:
POST
PUT perlu memiliki sisi yang tidak terpengaruh.
Itu salah. PUTidempoten tetapi tidak aman. The Inti dari PUTadalah memiliki efek samping, yaitu memperbarui sumber daya. Apa yang dimaksud dengan idempotensi adalah bahwa memperbarui sumber daya yang sama dengan konten yang sama beberapa kali harus memiliki efek yang sama dengan memperbarui hanya sekali.
Perhatikan paragraf terakhir di bagian tentang keselamatan [penekanan tambang]:
Secara alami, tidak mungkin untuk memastikan bahwa server tidak menghasilkan efek samping sebagai akibat dari melakukan GETpermintaan; pada kenyataannya, beberapa sumber daya dinamis menganggap itu sebagai fitur. Perbedaan penting di sini adalah bahwa pengguna tidak meminta efek samping, sehingga tidak dapat dimintai pertanggungjawaban atas efek sampingnya .
Meskipun kalimat ini berbicara tentang GETdan keamanan, kita dapat mengasumsikan bahwa penulis juga bermaksud menerapkan alasan PUTdan idempotensi yang sama. TKI: PUTseharusnya hanya memiliki satu efek samping yang terlihat pengguna , yaitu memperbarui sumber daya yang disebutkan. Ini mungkin memiliki efek samping lain, tetapi pengguna tidak bertanggung jawab untuk itu.
Misalnya, fakta yang PUTidempoten berarti bahwa saya dapat mencoba kembali sesering yang saya inginkan: spec menjamin bahwa mengeksekusinya berkali-kali akan persis sama dengan mengeksekusinya sekali. Sangat valid untuk membuat backlog revisi lama sebagai efek samping dari beberapa PUTpermintaan tersebut. Namun, jika, sebagai hasil dari beberapa percobaan ulang, database Anda dipenuhi dengan tumpukan revisi lama, itu bukan masalah saya, itu milik Anda.
TKI: Anda diizinkan memiliki efek samping sebanyak yang Anda inginkan, tetapi
- itu harus melihat ke pengguna seolah-olah permintaan mereka idempoten
- Anda bertanggung jawab atas efek samping tersebut, bukan pengguna