Potensi idem
Setelah RFC, seorang PUT harus mengirimkan objek penuh ke sumber daya. Alasan utama ini, adalah bahwa PUT harus idempoten. Ini berarti permintaan, yang diulang harus mengevaluasi hasil yang sama di server.
Jika Anda mengizinkan pembaruan parsial, itu tidak bisa lagi menjadi potensi. Jika Anda memiliki dua klien. Klien A dan B, maka skenario berikut dapat berkembang:
Klien A mendapatkan gambar dari gambar sumber. Ini berisi deskripsi gambar, yang masih valid. Klien B menempatkan gambar baru dan memperbarui deskripsi yang sesuai. Gambar telah berubah. Klien A melihat, dia tidak perlu mengubah deskripsi, karena itu sesuai keinginannya dan hanya menempatkan gambar.
Ini akan menyebabkan inkonsistensi, gambar memiliki metadata yang salah terpasang!
Yang lebih menjengkelkan adalah bahwa perantara mana pun dapat mengulangi permintaan itu. Dalam kasus itu memutuskan entah bagaimana PUT gagal.
Arti PUT tidak dapat diubah (meskipun Anda dapat menyalahgunakannya).
Pilihan lain
Untungnya ada opsi lain, ini adalah PATCH. PATCH adalah metode yang memungkinkan Anda memperbarui sebagian struktur. Anda cukup mengirim struktur parsial. Untuk aplikasi sederhana, ini baik-baik saja. Metode ini tidak dijamin ampuh. Klien harus mengirim permintaan dalam bentuk berikut:
PATCH /file.txt HTTP/1.1
Host: www.example.com
Content-Type: application/example
If-Match: "e0023aa4e"
Content-Length: 20
{fielda: 1, fieldc: 2}
Dan server dapat membalas kembali dengan 204 (Tidak ada konten) untuk menandai keberhasilan. Kesalahan Anda tidak dapat memperbarui bagian dari struktur. Metode PATCH adalah atom.
Kelemahan dari metode ini adalah, tidak semua browser mendukung ini, tetapi ini adalah opsi paling alami dalam layanan REST.
Contoh tambalan permintaan:
http://tools.ietf.org/html/rfc5789#section-2.1
Json menambal
Opsi json tampaknya cukup komprehensif dan opsi yang menarik. Tetapi bisa sulit untuk diterapkan untuk pihak ketiga. Anda harus memutuskan apakah basis pengguna Anda dapat menangani ini.
Ini juga agak berbelit-belit, karena Anda perlu membangun penerjemah kecil yang mengubah perintah menjadi struktur parsial, yang akan Anda gunakan untuk memperbarui model Anda. Penerjemah ini juga harus memeriksa, apakah perintah yang diberikan masuk akal. Beberapa perintah membatalkan satu sama lain. (tulis fielda, hapus fielda). Saya pikir Anda ingin melaporkan ini kembali ke klien untuk membatasi waktu debug di pihaknya.
Tetapi jika Anda punya waktu, ini adalah solusi yang sangat elegan. Anda masih harus memvalidasi bidang tentu saja. Anda dapat menggabungkan ini dengan metode PATCH untuk tetap menjadi model REST. Tapi saya pikir POST dapat diterima di sini.
Menjadi buruk
Jika Anda memutuskan untuk menggunakan opsi PUT, yang agak berisiko. Maka Anda setidaknya tidak harus membuang kesalahan. Pengguna memiliki harapan tertentu (data akan diperbarui) dan jika Anda memecahkan ini, Anda akan memberikan beberapa pengembang bukan waktu yang baik.
Anda dapat memilih untuk mundur: 409 Konflik atau 403 Dilarang. Tergantung bagaimana Anda melihat proses pembaruan. Jika Anda melihatnya sebagai seperangkat aturan (sistem-sentris), maka konflik akan lebih baik. Sesuatu seperti, bidang ini tidak dapat diperbarui. (Bertentangan dengan aturan). Jika Anda melihatnya sebagai masalah otorisasi (user-centric), maka Anda harus kembali terlarang. Dengan: Anda tidak diizinkan mengubah bidang ini.
Anda masih harus memaksa pengguna untuk mengirim semua bidang yang dapat dimodifikasi.
Pilihan yang masuk akal untuk menegakkan ini adalah untuk mengaturnya ke sub-sumber daya, yang hanya menawarkan data yang dapat dimodifikasi.
Opini pribadi
Secara pribadi saya akan pergi (jika Anda tidak harus bekerja dengan browser) untuk model PATCH sederhana dan kemudian memperpanjangnya dengan prosesor patch JSON. Ini dapat dilakukan dengan membedakan pada mimetypes: Tipe mime dari patch json:
aplikasi / json-patch
Dan json: application / json-patch
membuatnya mudah untuk mengimplementasikannya dalam dua fase.