Pertanyaan Respons REST yang tepat untuk tabel kosong?


Katakanlah Anda ingin mendapatkan daftar pengguna dengan menelepon get untuk api/users tetapi saat ini meja terpotong sehingga tidak ada pengguna. Apa tanggapan yang tepat untuk skenario ini 404 atau 204?


75
2017-11-13 18:43


asal


Jawaban:


Saya akan mengatakan, juga.

Kenapa tidak 404 (Tidak Ditemukan)?

Kode status 404 harus disediakan untuk situasi, di mana sumber daya tidak ditemukan. Dalam hal ini, sumber daya Anda koleksi pengguna. Koleksi ini ada tetapi saat ini kosong. Secara pribadi, saya akan sangat bingung sebagai penulis klien untuk aplikasi Anda jika saya mendapat 200 satu hari dan satu 404 keesokan harinya hanya karena seseorang kebetulan menghapus beberapa pengguna. Apa yang harus aku lakukan? Apakah URL saya salah? Apakah seseorang mengubah API dan lalai meninggalkan pengalihan.

Mengapa tidak 204 (Tanpa Konten)?

Berikut kutipan dari uraian kode status 204 oleh w3c

Server telah memenuhi permintaan tetapi tidak perlu mengembalikan badan entitas, dan mungkin ingin mengembalikan metainformasi yang diperbarui.

Meskipun ini mungkin masuk akal dalam kasus ini, saya pikir itu juga akan membingungkan klien. SEBUAH 204 Seharusnya menunjukkan bahwa beberapa operasi berhasil dijalankan dan tidak ada data yang perlu dikembalikan. Ini sempurna sebagai respons terhadap a DELETE meminta atau mungkin menembaki beberapa skrip yang tidak perlu mengembalikan data. Dalam kasus api/users, Anda biasanya berharap untuk menerima representasi koleksi pengguna Anda. Mengirim respons tubuh satu kali dan tidak mengirimnya pada waktu lain tidak konsisten dan berpotensi menyesatkan.

Mengapa saya menggunakan 200 (OK)

Untuk alasan yang disebutkan di atas (konsistensi), saya akan mengembalikan representasi koleksi kosong. Anggaplah Anda menggunakan XML. Tubuh respons normal untuk koleksi pengguna yang tidak kosong dapat terlihat seperti ini:

<users>
  <user>
    <id>1</id>
    <name>Tom</name>
  </user>
  <user>
    <id>2</id>
    <name>IMB</name>
  </user>
</users>

dan jika daftar kosong, Anda hanya dapat merespons dengan sesuatu seperti ini (saat masih menggunakan a 200):

<users/>

Either way, klien menerima tubuh respon yang mengikuti format tertentu yang terkenal. Tidak ada kebingungan dan pemeriksaan kode status yang tidak perlu. Juga, tidak ada definisi kode status yang dilanggar. Semua orang senang.

Anda dapat melakukan hal yang sama dengan JSON atau HTML atau format apa pun yang Anda gunakan.


156
2017-11-13 19:14



Saya akan menjawab salah satu dari dua kode tergantung pada situasi runtime:

404 tidak ditemukan)

Jawaban ini cukup benar jika Anda tidak memiliki meja. Bukan hanya meja kosong tetapi TIDAK ADA TABEL PENGGUNA. Ini menegaskan ide yang tepat - tidak ada sumber daya. Pilihan lebih lanjut adalah untuk memberikan rincian lebih lanjut MENGAPA meja Anda tidak ada, ada beberapa kode yang lebih rinci tetapi 404 cukup bagus untuk merujuk ke situasi di mana Anda benar-benar tidak memiliki meja.

200 (Oke)

Semua kasus di mana Anda memiliki tabel tetapi kosong atau prosesor permintaan Anda memfilter semua hasil. Ini berarti 'permintaan Anda benar, semuanya OK tetapi Anda tidak cocok dengan data apa pun hanya karena kami tidak memiliki data atau kami tidak memiliki data yang sesuai dengan permintaan Anda. Ini harus berbeda dari jawaban penolakan keamanan. Saya juga memberikan suara untuk mengembalikan 200 dalam situasi di mana Anda memiliki beberapa data dan secara umum Anda diizinkan untuk mengakses tabel tetapi tidak memiliki akses ke semua data yang cocok dengan permintaan Anda (data disaring karena keamanan tingkat objek tetapi secara umum Anda diizinkan untuk permintaan).


7
2018-02-13 22:16



Jika Anda mengharapkan daftar objek pengguna, solusi terbaik adalah mengembalikan daftar kosong ([]) daripada menggunakan tanggapan 404 atau 204.


4
2018-05-08 23:30