Saya sedang membangun server yang memungkinkan klien untuk menyimpan objek. Objek-objek tersebut sepenuhnya dibangun di sisi klien, lengkap dengan ID objek yang permanen untuk seumur hidup objek.
Saya telah mendefinisikan API sehingga klien dapat membuat atau memodifikasi objek menggunakan PUT:
PUT /objects/{id} HTTP/1.1
...
{json representation of the object}
{Id} adalah ID objek, jadi itu adalah bagian dari URI Permintaan.
Sekarang, saya juga mempertimbangkan untuk mengizinkan klien membuat objek menggunakan POST:
POST /objects/ HTTP/1.1
...
{json representation of the object, including ID}
Karena POST dimaksudkan sebagai operasi "tambahkan", saya tidak yakin apa yang harus dilakukan jika objek sudah ada di sana. Haruskah saya memperlakukan permintaan sebagai permintaan modifikasi atau haruskah saya mengembalikan beberapa kode kesalahan (yang)?
Jawaban:
Perasaan saya
409 Conflict
adalah yang paling tepat, namun, jarang terlihat di alam liar tentu saja:sumber
HTTP 409
denganLocation
tajuk yang menunjuk ke sumber daya yang ada / bertentangan.Menurut RFC 7231 , 303 See Other MUNGKIN digunakan Jika hasil pemrosesan POST akan setara dengan representasi sumber daya yang ada .
sumber
Secara pribadi saya pergi dengan ekstensi WebDAV
422 Unprocessable Entity
.Menurut RFC 4918
sumber
422
sayaIni semua tentang konteks , dan juga siapa yang bertanggung jawab untuk menangani duplikat dalam permintaan (server atau klien atau keduanya)
Jika server hanya mengarahkan duplikat , lihat 4xx:
Untuk penanganan duplikat secara implisit , lihat 2XX:
jika server diharapkan mengembalikan sesuatu , lihat 3XX:
ketika server mampu menunjukkan sumber daya yang ada, itu berarti pengalihan.
Jika hal di atas tidak cukup, selalu merupakan praktik yang baik untuk menyiapkan beberapa pesan kesalahan di tubuh respons.
sumber
Mungkin terlambat bermain, tetapi saya menemukan masalah semantik ini ketika mencoba membuat REST API.
Untuk sedikit memperluas jawaban Wrikken, saya pikir Anda dapat menggunakan salah satu
409 Conflict
atau403 Forbidden
bergantung pada situasinya - singkatnya, gunakan kesalahan 403 ketika pengguna sama sekali tidak dapat menyelesaikan konflik dan menyelesaikan permintaan (mis. Mereka tidak dapat mengirimDELETE
meminta untuk menghapus sumber daya secara eksplisit), atau menggunakan 409 jika sesuatu dapat dilakukan.Saat ini, seseorang mengatakan "403" dan masalah izin atau otentikasi muncul di benak, tetapi spek itu mengatakan bahwa pada dasarnya server memberi tahu klien bahwa itu tidak akan melakukannya, jangan tanya lagi, dan inilah mengapa klien tidak boleh 't.
Adapun
PUT
vs.POST
...POST
harus digunakan untuk membuat instance baru dari sumber daya ketika pengguna tidak memiliki cara untuk atau tidak seharusnya membuat pengidentifikasi untuk sumber daya.PUT
digunakan ketika identitas sumber daya diketahui.sumber
POST
permintaan (bila digunakan dengan benar), karena menyatakan bahwa ia harus dikembalikan ketika bertentangan dengan sumber daya target . Karena sumber daya target belum diposting, itu tidak mungkin bertentangan, dan dengan demikian untuk membalas dengan409 Conflict
tidak masuk akal.POST
, pada kenyataannya, saya akan menyimpulkan sebaliknya karena "Konflik paling mungkin terjadi dalam menanggapi permintaan PUT." tampaknya menunjukkan bahwa metode permintaan lain juga dapat menggunakan kode ini. Selain itu, "Badan respons harus mencakup informasi yang cukup bagi pengguna untuk mengenali sumber konflik. Idealnya, entitas respons akan mencakup informasi yang cukup bagi pengguna atau agen pengguna untuk memperbaiki masalah; namun, itu mungkin tidak mungkin dan tidak wajib . " ( webdav.org/specs/rfc2616.html#status.409 )"302 Found" terdengar logis untukku. Dan RFC 2616 mengatakan bahwa itu BISA dijawab untuk permintaan selain GET dan HEAD (dan ini pasti termasuk POST)
Tapi itu tetap membuat pengunjung pergi ke URL ini untuk mendapatkan sumber daya "Ditemukan" ini, oleh RFC. Untuk membuatnya pergi langsung ke URL "Ditemukan" yang asli, seseorang harus menggunakan "303 See Other", yang masuk akal, tetapi memaksa panggilan lain untuk MENDAPATKAN URL berikut. Sisi baiknya, GET ini bisa di-cache.
Saya pikir saya akan menggunakan "303 See Other" . Saya tidak tahu apakah saya bisa merespons dengan "benda" yang ditemukan di dalam tubuh, tetapi saya ingin melakukannya untuk menyimpan satu perjalanan pulang pergi ke server.
UPDATE: Setelah membaca ulang RFC, saya masih berpikir bahwa inexistent "4XX + 303 Ditemukan" kode harus benar. Namun, "409 Conflict" adalah kode jawaban terbaik yang ada (seperti yang ditunjukkan oleh @Wrikken), mungkin termasuk header Lokasi yang menunjuk ke sumber daya yang ada.
sumber
Saya tidak berpikir Anda harus melakukan ini.
POST, seperti yang Anda tahu, memodifikasi koleksi dan digunakan untuk MENCIPTAKAN item baru. Jadi, jika Anda mengirim id (saya pikir itu bukan ide yang baik), Anda harus memodifikasi koleksi, yaitu, memodifikasi item, tetapi membingungkan.
Gunakan itu untuk menambahkan item, tanpa id. Ini praktik terbaik.
Jika Anda ingin menangkap batasan UNIK (bukan id), Anda dapat merespons 409, seperti yang dapat Anda lakukan dalam permintaan PUT. Tapi bukan ID.
sumber
Saya akan pergi dengan
422 Unprocessable Entity
, yang digunakan ketika permintaan tidak valid tetapi masalah tidak dalam sintaks atau otentikasi.Sebagai argumen terhadap jawaban lain, menggunakan
4xx
kode non- kesalahan akan menyiratkan itu bukan kesalahan klien, dan jelas itu. Untuk menggunakan4xx
kode non- kesalahan untuk mewakili kesalahan klien sama sekali tidak masuk akal.Tampaknya itu
409 Conflict
adalah jawaban yang paling umum di sini, tetapi, menurut spesifikasi, itu menyiratkan bahwa sumber daya sudah ada dan data baru yang Anda lamar tidak sesuai dengan keadaan saat ini. Jika Anda mengirimPOST
meminta, dengan, misalnya, nama pengguna yang sudah diambil, itu sebenarnya tidak bertentangan dengan sumber daya target, karena sumber daya target (sumber daya yang Anda coba buat) belum diposting. Ini adalah kesalahan khusus untuk kontrol versi, ketika ada konflik antara versi sumber daya yang disimpan dan versi sumber daya yang diminta. Ini sangat berguna untuk tujuan itu, misalnya ketika klien telah men-cache versi lama sumber daya dan mengirimkan permintaan berdasarkan versi yang salah yang tidak lagi valid secara kondisi. "Dalam hal ini, perwakilan respons kemungkinan akan berisi informasi yang berguna untuk menggabungkan perbedaan berdasarkan riwayat revisi." Permintaan untuk membuat pengguna lain dengan nama pengguna itu tidak dapat diproses, tidak ada hubungannya dengan kontrol versi.Sebagai catatan, 422 juga merupakan kode status yang digunakan GitHub ketika Anda mencoba membuat repositori dengan nama yang sudah digunakan.
sumber
Saya pikir untuk REST, Anda hanya perlu membuat keputusan tentang perilaku untuk sistem tertentu dalam hal ini, saya pikir jawaban "benar" akan menjadi salah satu dari beberapa jawaban yang diberikan di sini. Jika Anda ingin permintaan berhenti dan bersikap seolah-olah klien membuat kesalahan yang perlu diperbaiki sebelum melanjutkan, maka gunakan 409. Jika konflik benar-benar tidak penting dan ingin membuat permintaan tetap berjalan, maka balas dengan mengarahkan ulang klien ke entitas yang ditemukan. Saya pikir API REST yang tepat harus mengarahkan ulang (atau setidaknya memberikan header lokasi) ke titik akhir GET untuk sumber daya yang mengikuti POST, jadi perilaku ini akan memberikan pengalaman yang konsisten.
EDIT: Perlu dicatat bahwa Anda harus mempertimbangkan PUT karena Anda memberikan ID. Maka perilakunya sederhana: "Saya tidak peduli apa yang ada di sana sekarang, letakkan benda ini di sana." Artinya, jika tidak ada di sana, itu akan dibuat; jika ada sesuatu di sana itu akan diganti. Saya pikir POST lebih tepat ketika server mengelola ID itu. Memisahkan kedua konsep pada dasarnya memberi tahu Anda cara menghadapinya (yaitu PUT idempoten sehingga harus selalu berfungsi selama payload divalidasi, POST selalu menciptakan, jadi jika ada tabrakan ID, maka 409 akan menggambarkan konflik itu) .
sumber
POST
permintaan (bila digunakan dengan benar), karena menyatakan bahwa ia harus dikembalikan ketika bertentangan dengan sumber daya target . Karena sumber daya target belum diposting, itu tidak mungkin bertentangan, dan dengan demikian untuk membalas dengan409 Conflict
tidak masuk akal.PUT
.Pengobatan potensial lain adalah menggunakan PATCH. PATCH didefinisikan sebagai sesuatu yang mengubah keadaan internal dan tidak terbatas pada penambahan.
PATCH akan menyelesaikan masalah dengan memungkinkan Anda memperbarui item yang sudah ada. Lihat: RFC 5789: PATCH
sumber
Mengapa tidak diterima ? Ini permintaan OK (200-an), tidak ada kesalahan klien (400-an), per se.
Dari 10 Definisi Kode Status :
... karena itu tidak perlu diselesaikan, karena sudah ada. Klien tidak tahu itu sudah ada, mereka tidak melakukan kesalahan.
Saya bersandar untuk melempar 202, dan mengembalikan konten serupa ke apa yang
/{resource}/{id}
akan didapat GET .sumber
Stumbled atas pertanyaan ini sambil memeriksa kode yang benar untuk catatan duplikat.
Maafkan ketidaktahuan saya tapi saya tidak mengerti mengapa semua orang mengabaikan kode "300" yang dengan jelas mengatakan "pilihan ganda" atau "ambigu"
Menurut pendapat saya ini akan menjadi kode sempurna untuk membangun sistem non standar atau tertentu untuk Anda gunakan sendiri. Saya bisa salah juga!
https://tools.ietf.org/html/rfc7231#section-6.4.1
sumber
Lebih mungkin
400 Bad Request
Karena permintaan berisi nilai duplikat (nilai yang sudah ada), itu dapat dianggap sebagai kesalahan klien. Perlu mengubah permintaan sebelum percobaan berikutnya.
Dengan mempertimbangkan fakta-fakta ini kita dapat menyimpulkan sebagai Permintaan Buruk HTTP STATUS 400.
sumber
Bagaimana dengan 208 - http://httpstatusdogs.com/208-al sudah- dilaporkan ? Apakah itu pilihan?
Menurut pendapat saya, jika satu-satunya hal adalah sumber daya yang berulang tidak ada kesalahan yang harus diajukan. Lagi pula, tidak ada kesalahan pada sisi klien atau server.
sumber
Dalam kasus Anda, Anda dapat menggunakan
409 Conflict
Dan jika Anda ingin memeriksa yang lain
HTTPs
kode status dari daftar di bawah ini1 × × Informasional
2 × × Sukses
3 × × Pengalihan
4 × × Kesalahan Klien
5 × × Kesalahan Server
sumber