Orang-orang yang merancang HTTP / 2 jauh lebih bertele-tele tentang ide-ide mereka tentang apa yang harus dilakukan HTTP, sambil tetap mempertahankan makna lama. Mari kita lihat apa yang dikatakan draf spesifikasi HTTP / 2 tentang idempotensi:
4.2.2. Metode Idempoten
Metode permintaan dianggap "idempoten" jika efek yang dituju pada server dari beberapa permintaan yang identik dengan metode itu sama dengan efek untuk satu permintaan seperti itu. metode idempoten.
Seperti definisi safe, properti idempotent hanya berlaku untuk apa yang telah diminta oleh pengguna; server bebas untuk mencatat setiap permintaan secara terpisah, mempertahankan riwayat kontrol revisi, atau menerapkan efek samping non-idempoten lainnya untuk setiap permintaan idempoten .
The efek dimaksudkan pada server untuk setiap permintaan PUT tersebut adalah untuk memperbarui sumberdaya yang diidentifikasi oleh URI . Inilah yang terjadi dalam kasus Anda.
Anda memutuskan untuk versi sumber daya tidak terlalu penting di sini. Jika Anda tidak ingin membuat versi baru ketika tidak ada yang berubah, Anda harus membandingkan muatan dalam permintaan PUT dengan versi sumber daya terbaru (atau diidentifikasi), dan ketika tidak ada properti yang berubah Anda dapat memilih untuk tidak membuat versi baru .
Hasil edit Anda:
Riwayat akan terlihat oleh pengguna, menelepon beberapa kali akan menghasilkan banyak konversi
Sejauh menyangkut sumber daya, itu tidak ada efek samping . Sumber daya di URI itu tidak berubah (properti yang sama mendapatkan PUT). Sejarah hanyalah metadata, karena kemungkinan besar diminta oleh URI yang berbeda atau dengan header permintaan yang berbeda.
time
properti diperbarui? Saya pikir itu juga metadata, meskipun ada di sumber daya.HTTP membedakan antara dua properti:
Idempotensi didefinisikan oleh spek sebagai berikut:
Dan keamanan:
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:
GET
,HEAD
,OPTION
,TRACE
PUT
,DELETE
POST
Itu salah.
PUT
idempoten tetapi tidak aman. The Inti dariPUT
adalah 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]:
Meskipun kalimat ini berbicara tentang
GET
dan keamanan, kita dapat mengasumsikan bahwa penulis juga bermaksud menerapkan alasanPUT
dan idempotensi yang sama. TKI:PUT
seharusnya 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
PUT
idempoten 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 beberapaPUT
permintaan 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
sumber
Anda benar bahwa PUT tidak perlu memengaruhi , namun saya akan menambahkan sesuatu untuk ini.
Anda memperbarui
person
sumber daya yang diidentifikasi sebagaiF02E395A235
, jadi menggunakan PUT benar. Sekarang sebagai aturan bisnis Anda juga melacak perubahan yang tidak terlihat oleh entitas panggilan (konsumen layanan REST). Ini tidak akan menambahkan item baru diperson
sumber daya. Cuplikan historis tidak akan dapat diakses menggunakan/person/
titik akhir. Jadi saya percaya, PUT harus bisa diterima dalam kasus ini.sumber