Kode status HTTP untuk permintaan yang berhasil sebagian

115

Saya memiliki aplikasi yang mengirim pesan ke pengguna. Dalam permintaan posting, string XML ditransfer yang terdiri dari semua pengguna yang harus menerima pesan khusus itu. Jika salah satu pengguna dalam daftar tidak ada, saya mengembalikan daftar pengguna yang hilang ke klien untuk evaluasi lebih lanjut.

Sekarang saya bertanya pada diri sendiri apa yang akan menjadi kode status yang tepat untuk aplikasi yang mengatakan bahwa permintaan tersebut diterima tetapi ada hal-hal yang tidak dapat dilakukan.

Masalahnya akan dihindari jika tidak diizinkan untuk memasukkan pengguna yang hilang dalam daftar. Maka upaya pengiriman hanya akan mendapatkan kesalahan 4xx. Tetapi tidak ada gunanya membentuk API dengan cara ini. Di sisi lain, saya dapat menganggap kondisi kesalahan hanya untuk aplikasi tertentu. Tetapi mengirim 200 tidak terasa benar. Dan alangkah baiknya memberi petunjuk kepada klien kapan harus melihat lebih dalam dalam respons kesalahan. misalnya untuk menghindari pengiriman pesan ke pengguna tersebut berulang kali

Norbert Hartl
sumber

Jawaban:

66

Saya telah menangani masalah yang sangat mirip. Dalam kasus ini, saya mengembalikan file

207 Multi-Status

Sekarang, ini bukan HTTP yang ketat, ini bagian dari ekstensi WebDAV, jadi jika Anda tidak memiliki kendali atas klien juga, maka ini tidak baik untuk Anda. Jika ya, Anda dapat melakukan sesuatu seperti ini:

   <?xml version="1.0" encoding="utf-8" ?>
   <D:multistatus xmlns:D='DAV:'>
     <D:response>
       <D:user>user-123</D:user>
       <D:status>success</D:status>
     </D:response>
     <D:response>
       <D:user>user-789</D:user>
       <D:status>failure</D:status>
     </D:response>
   </D:multistatus>

Tetapi sekali lagi, ini adalah ekstensi HTTP, dan Anda juga harus memiliki kendali atas klien.

Kylar
sumber
3
Saya berpikir untuk menggunakan ini tetapi saya tidak begitu nyaman dengannya. Terima kasih!
Norbert Hartl
Hal yang menyenangkan tentang ini adalah Anda dapat mengembalikan sebanyak atau sedikit data terkait yang Anda inginkan - yang sangat berguna untuk kumpulan data campuran, yaitu: di mana beberapa gagal dan beberapa lolos.
Kylar
Saya mengerti. Saya hanya mencoba menghindari tingkat penanganan status ekstra (yang IMHO tidak bagus). Sebagian besar kode saya berfungsi dengan kode HTTP. Dan saya pikir kasus penggunaan yang saya jelaskan akan baik-baik saja tanpa.
Norbert Hartl
Anda selalu dapat mengirim badan kembali - kirim 200 dengan tanggapan JSON atau apa pun yang Anda inginkan di dalamnya untuk menentukan mana yang berhasil.
Kylar
Ya saya tahu. Tetapi jika Anda mengembalikan tubuh, Anda perlu menguraikannya. Dan pada saat itu Anda memperkenalkan lapisan kedua dari penanganan logika aplikasi. Hal ini menimbulkan kompleksitas dan Anda memerlukan alasan yang kuat untuk melakukannya.
Norbert Hartl
65

Saya memiliki masalah yang sama, dan saya akhirnya menggunakan dua solusi berbeda:

  • Kode pengembalian HTTP 202: Accepted, menunjukkan bahwa permintaan itu baik-baik saja, tetapi tidak ada jaminan semuanya benar-benar berjalan sebagaimana mestinya.
  • Kembalikan 200respons normal , tetapi sertakan daftar apa yang tidak berjalan dengan baik di isi respons.

Yang kedua biasanya berfungsi paling baik, tetapi yang pertama bagus jika Anda malas atau menggunakan antrian untuk memproses.

Arne
sumber
5
Bukankah 202 lebih mengacu pada sesuatu seperti mengantri?
Sinaesthetic
6
Ya, @Sinaesthetic. Dari spesifikasi HTTP 1.1 terbaru, "(...) permintaan telah diterima untuk diproses, tetapi pemrosesan belum selesai". Jadi, untuk kesuksesan parsial, 202 tidak sesuai.
Huercio
-4

Bagaimana dengan menggunakan 206 Konten Parsial. Saya tahu 206 lebih banyak tentang rentang, tetapi bagaimana jika itu bisa menunjukkan permintaan yang berhasil sebagian?

Yusuf
sumber
MDN menyatakan sebagai berikut: "Kode respons status sukses Konten Parsial HTTP 206 menunjukkan bahwa permintaan telah berhasil dan memiliki isi berisi rentang data yang diminta, seperti yang dijelaskan di header Rentang permintaan." Sejauh yang saya pahami, 206 Konten Parsial hanya untuk permintaan dengan berbagai konten.
sbbs
-14

HyperText Transfer Protocol menangani sisi transmisi sesuatu. Tidak ada kode kesalahan untuk menangani kesalahan tingkat aplikasi.

Mengembalikan 200 adalah hal yang benar untuk dilakukan di sini. Sejauh menyangkut HTTP, permintaan itu diterima dengan benar, ditangani dengan benar, dan Anda mengirim balasannya. Jadi, pada level HTTP semuanya OK. Kesalahan atau peringatan apa pun yang terkait dengan aplikasi yang berjalan di atas http harus ada di dalam respons. Melakukannya juga akan mencegah beberapa masalah buruk yang mungkin Anda hadapi dengan server proxy yang mungkin tidak menangani respons tertentu seperti yang Anda harapkan.

AVee
sumber
18
HTTP adalah protokol tingkat aplikasi. Anda tidak bisa hanya meletakkannya di tingkat transportasi dan aplikasi. Jika Anda berpikir tentang OSI maka HTTP ada di lapisan 5-7. HTTP agak berbeda. Sebagian besar header dan kode pengembalian memang khusus untuk aplikasi. Kode hanya bergantung pada informasi yang diberikan dalam entitas protokol HTTP dan bukan pada hal format aplikasi kustom. Mengenai 200, saya akan mengatakan bahwa definisi Anda sepenuhnya salah jika diterapkan pada kata kerja yang tidak POST. Tetapi POST mengubah permainan sedikit dan dalam konteks ini asumsi Anda "ditangani dengan benar" juga tidak pasti
Norbert Hartl
Sebenarnya OSI menganggap HTTP sebagai protokol tingkat aplikasi dan ketika berbicara dengan server web 'normal' ini benar. Tetapi dalam kasus Anda, Anda menjalankan protokol Anda sendiri di atas HTTP, seperti yang dilakukan banyak aplikasi hari ini. Dalam jenis penggunaan itu, HTTP hanya menyediakan transportasi. (Aplikasi Anda mengirim pesan ke pengguna, bukan mentransfer hypertext ...)
AVee
2
Hanya untuk memperjelas. HTTP dengan cara REST berpusat pada sumber daya. Dalam konteks ini 200 berarti identitas (sumber daya yang Anda tentukan), bukan 3xx yang mengarah ke identitas. Menggunakan POST mengubah URI sumber daya menjadi URI pemrosesan dan kode kesalahan perlu mengatasinya. Konteksnya sedikit bergeser dan definisi hal-hal menjadi agak kabur atau setidaknya sulit dipahami
Norbert Hartl
1
Pergeseran konteks juga berarti tidak ada kode kesalahan yang sesuai, karena protokol tidak pernah dirancang dengan konteks itu dalam pikiran ;-) Saya juga berpikir Anda harus berhati-hati menggunakan kode kesalahan karena server proxy cenderung berjalan dengan mereka menggantikan respons Anda dengan halaman kesalahan khusus, ini bisa menjadi PITA nyata.
AVee
1
Bagaimanapun, terima kasih telah menjawab pertanyaan saya. Saya baru saja menemukan stackoverflow adalah klien obrolan yang buruk :)
Norbert Hartl