Idenya adalah bahwa respons tubuh memberi Anda halaman yang menghubungkan Anda ke hal tersebut:
201 Dibuat
Kode status 201 (Dibuat) menunjukkan bahwa permintaan telah dipenuhi dan menghasilkan satu atau lebih sumber daya baru yang dibuat. Sumber daya utama yang dibuat oleh permintaan diidentifikasi oleh bidang header Lokasi dalam respons atau, jika tidak ada bidang Lokasi yang diterima, oleh URI permintaan yang efektif.
Ini berarti bahwa Anda akan mencakup Location
dalam respon sundulan yang memberikan URL dari mana Anda dapat menemukan yang baru dibuat hal :
HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597
Tubuh respon
Mereka kemudian melanjutkan dengan menyebutkan apa yang harus Anda sertakan dalam badan tanggapan :
Payload respons 201 biasanya mendeskripsikan dan menautkan ke resource yang dibuat.
Untuk manusia yang menggunakan browser, Anda memberi mereka sesuatu yang dapat mereka lihat, dan klik, untuk mendapatkan sumber daya yang baru mereka buat:
HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597
Content-Type: text/html
Your answer has been saved!
Click <A href="https://stackoverflow.com/a/36373586/12597">here</A> to view it.
Jika laman tersebut hanya akan digunakan oleh robot, masuk akal untuk memiliki respons yang dapat dibaca oleh komputer:
HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597
Content-Type: application/xml
<createdResources>
<questionID>1860645</questionID>
<answerID>36373586</answerID>
<primary>/a/36373586/12597</primary>
<additional>
<resource>http://stackoverflow.com/questions/1860645/create-request-with-post-which-response-codes-200-or-201-and-content/36373586#36373586</resource>
<resource>http://stackoverflow.com/a/1962757/12597</resource>
</additional>
</createdResource>
Atau, jika Anda lebih suka:
HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597
Content-Type: application/json
{
"questionID": 1860645,
"answerID": 36373586,
"primary": "/a/36373586/12597",
"additional": [
"http://stackoverflow.com/questions/1860645/create-request-with-post-which-response-codes-200-or-201-and-content/36373586#36373586",
"http://stackoverflow.com/a/36373586/12597"
]
}
Tanggapan sepenuhnya terserah Anda; itu sesuka Anda.
Ramah cache
Akhirnya ada pengoptimalan bahwa saya dapat melakukan pra-cache sumber daya yang dibuat (karena saya sudah memiliki konten; saya baru saja mengunggahnya). Server dapat mengembalikan tanggal atau ETag yang dapat saya simpan dengan konten yang baru saya unggah:
Lihat Bagian 7.2 untuk diskusi tentang arti dan tujuan bidang header validator, seperti ETag dan Last-Modified, dalam respons 201.
HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/23704283/12597
Content-Type: text/html
ETag: JF2CA53BOMQGU5LTOQQGC3RAMV4GC3LQNRSS4
Last-Modified: Sat, 02 Apr 2016 12:22:39 GMT
Your answer has been saved!
Click <A href="https://stackoverflow.com/a/36373586/12597">here</A> to view it.
Dan ETag
s adalah nilai yang murni sewenang-wenang. Membuatnya berbeda ketika sumber daya berubah (dan cache perlu diperbarui) adalah yang terpenting. ETag biasanya berupa hash (misalnya SHA2). Tapi itu bisa berupa database rowversion
, atau nomor revisi yang bertambah. Apa pun yang akan berubah saat hal itu berubah.
Menurut saya, REST API atompub adalah contoh bagus dari layanan yang tenang. Lihat cuplikan di bawah dari spesifikasi atompub:
Server memberi sinyal kreasi yang berhasil dengan kode status 201. Responsnya mencakup header Lokasi yang menunjukkan URI Entri Anggota dari Entri Atom, dan representasi Entri tersebut di dalam isi respons.
Entri yang dibuat dan dikembalikan oleh Koleksi mungkin tidak cocok dengan Entri yang DIPOSTING oleh klien. Server MUNGKIN mengubah nilai berbagai elemen dalam Entri, seperti nilai atom: id, atom: diperbarui, dan atom: penulis, dan BISA memilih untuk menghapus atau menambahkan elemen dan atribut lain, atau mengubah konten elemen dan nilai atribut.
sumber
Dalam beberapa kata:
sumber
Lihat HTTP: Definisi Metode: POST .
sumber
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19
Ini hanya nilai kunci yang dipisahkan oleh titik dua.
ETag: "xyzzy"
Ini bisa berupa semua jenis data teks - Saya biasanya menyertakan string JSON dengan pengenal item yang dibuat. Kemudahan pengujian saja membuatnya menjadi bermanfaat.
Dalam contoh ini, pengidentifikasi, uri, dan jenis item yang dibuat adalah "karakteristik dan lokasi sumber daya".
sumber
Outputnya sebenarnya tergantung pada jenis konten yang diminta. Namun, setidaknya Anda harus meletakkan sumber daya yang telah dibuat di Lokasi. Sama seperti pola Pasca-Pengalihan-Dapatkan.
Dalam kasus saya, saya membiarkannya kosong sampai diminta sebaliknya. Karena itulah perilaku JAX-RS saat menggunakan Response.created ().
Namun, perhatikan bahwa browser dan kerangka kerja seperti Angular tidak mengikuti 201 secara otomatis. Saya telah mencatat perilaku tersebut di http://www.trajano.net/2013/05/201-created-with-angular-resource/
sumber
Jawaban lain yang saya miliki untuk ini adalah dengan mengambil pendekatan pragmatis dan mempertahankan kontrak REST API Anda sederhana. Dalam kasus saya, saya telah merefaktor REST API saya untuk membuat semuanya lebih dapat diuji tanpa menggunakan JavaScript atau XHR, hanya formulir dan tautan HTML sederhana.
Jadi untuk lebih spesifik tentang pertanyaan Anda di atas, saya hanya akan menggunakan kode pengembalian
200
dan pesan yang dikembalikan berisi pesan JSON yang dapat dipahami aplikasi Anda. Bergantung pada kebutuhan Anda, ini mungkin memerlukan ID dari objek yang baru dibuat sehingga aplikasi web bisa mendapatkan data dalam panggilan lain.Satu catatan, dalam kontrak API refactored saya, tanggapan POST tidak boleh berisi data yang dapat disimpan dalam cache karena POST tidak benar-benar dapat disimpan dalam cache, jadi batasi ke ID yang dapat diminta dan disimpan dalam cache menggunakan permintaan GET.
sumber