Saya bertanya-tanya tentang ini.
Misalkan saya memiliki user
sumber daya id
dan name
bidang. Jika saya ingin memperbarui bidang, saya bisa melakukan permintaan PATCH ke sumber daya seperti ini
PATCH /users/42
{"name": "john doe"}
Dan kemudian aplikasi akan memperbarui nama pengguna 42.
Tetapi mengapa jika saya mengulangi permintaan ini hasilnya akan berbeda?
Menurut RFC 5789
PATCH tidak aman atau idempoten
rest
api-design
http
web-api
mattecapu
sumber
sumber
{"name": "bendjamin franklin"}
Jawaban:
Permintaan PATCH bisa saja idempoten, tetapi tidak harus begitu. Itulah alasan mengapa ini dicirikan sebagai non-idempoten.
Apakah PATCH dapat menjadi idempoten atau tidak sangat bergantung pada bagaimana perubahan yang diperlukan dikomunikasikan.
Misalnya, jika format tambalan dalam bentuk
{change: 'Name' from: 'benjamin franklin' to: 'john doe'}
, maka setiap permintaan PATCH setelah yang pertama akan memiliki efek yang berbeda (respons kegagalan) dari permintaan pertama.Alasan lain untuk non-idempotensi adalah penerapan modifikasi pada hal lain selain sumber daya asli dapat menjadikan sumber daya tidak valid. Ini juga akan menjadi masalah jika Anda menerapkan perubahan beberapa kali.
sumber
<name>
elemen. Jika PATCH menambahkan<name>
elemen ke sumber daya yang awalnya tidak mengandung satu, maka menerapkan PATCH dua kali (atau menerapkannya ke sumber daya yang sudah mengandung a<name>
) membuat sumber daya tidak valid, karena tiba-tiba akan berisi dua<name>
elemen yang tidak diperbolehkan untuk sumber daya semacam itu.Saya pikir jawaban yang jelas ketika PATCH dalam tidak idempoten adalah paragraf ini dari RFC 5789:
Karena RFC menentukan bahwa tambalan berisi beberapa "perubahan umum" pada sumber daya, kita harus melihat lebih dari sekadar penggantian bidang biasa. Jika sumber daya untuk penghitung, maka tambalan dapat meminta peningkatannya, yang jelas bukan idempotet.
sumber
PATCH
permintaan menguraikan serangkaian operasi untuk diterapkan pada sumber daya, jika Anda menerapkan rangkaian operasi yang sama dua kali pada sumber daya yang sama, hasilnya mungkin tidak sama. Ini karena mendefinisikan operasi terserah Anda. Dengan kata lain Anda harus mendefinisikan aturan penggabungan .Ingatlah bahwa
PATCH
permintaan dapat digunakan untuk menambal sumber daya dalam berbagai format, bukan hanya JSON.Jadi
PATCH
permintaan bisa menjadi idempoten jika Anda mendefinisikan aturan penggabungan menjadi idempoten .Contoh idempoten:
Contoh non-idempoten:
Dalam contoh kedua saya menggunakan sintaksis "Mongo like" yang saya buat untuk menambah atribut. Jelas ini bukan idempoten, karena mengirimkan permintaan yang sama beberapa kali akan menghasilkan hasil yang berbeda setiap kali.
Sekarang Anda mungkin bertanya-tanya apakah menggunakan sintaks yang dibuat seperti itu valid. Menurut standar , itu adalah:
Dan Anda mungkin juga bertanya-tanya apakah itu tenang untuk menggunakan
PATCH
permintaan dengan cara ini, dan banyak orang menganggapnya tidak, inilah jawaban yang baik dengan banyak komentar tentang masalah ini.sumber