Respons REST yang tepat untuk tabel kosong?

106

Katakanlah Anda ingin mendapatkan daftar pengguna dengan memanggil GETuntuk api/users, namun saat meja itu dipotong sehingga tidak ada pengguna. Apa tanggapan yang tepat untuk skenario ini: 404atau 204?

IMB
sumber
19
Saya akan menanggapi dengan 200 dan koleksi kosong (bukan badan tanggapan kosong melainkan koleksi tanpa elemen di dalamnya, ini akan terlihat berbeda tergantung pada format yang dikembalikan)
toniedzwiedz
4
404 dalam konteks ini mungkin lebih cocok untuk 'tabel tidak ditemukan'. Saya akan mengatakan mengembalikan daftar kosong.
mata
Kemungkinan duplikat dari Apa kode respons REST yang tepat untuk permintaan yang valid tetapi data kosong?
EJoshuaS - Pulihkan Monica
2
@EJoshuaS Ini bukan. Kedua pertanyaan itu milik saya dan sangat tua. Mereka serupa tetapi bukan duplikat.
IMB
1
@EJoshuaS Mereka jelas bukan duplikat. Pertanyaan ini tentang /api/userssementara yang satu itu tentang /api/users/1.
Franklin Yu

Jawaban:

230

Aku juga tidak.

Mengapa tidak 404 (Tidak Ditemukan)?

Kode status 404 harus disediakan untuk situasi, di mana sumber daya tidak ditemukan. Dalam kasus ini, sumber daya Anda adalah kumpulan pengguna . Koleksi ini ada tetapi saat ini kosong. Secara pribadi, saya akan sangat bingung sebagai penulis klien untuk aplikasi Anda jika saya mendapat 200satu hari dan 404hari berikutnya 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 (Tidak Ada Konten)?

Berikut kutipan dari deskripsi kode status 204 oleh w3c

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

Meskipun ini mungkin tampak masuk akal dalam kasus ini, saya pikir itu juga akan membingungkan klien. A 204seharusnya menunjukkan bahwa beberapa operasi berhasil dijalankan dan tidak ada data yang perlu dikembalikan. Ini sempurna sebagai respons terhadap DELETEpermintaan atau mungkin mengaktifkan beberapa skrip yang tidak perlu mengembalikan data. Dalam kasus api/users, Anda biasanya mengharapkan untuk menerima representasi dari kumpulan pengguna Anda. Mengirim badan tanggapan satu kali dan tidak mengirimkannya di lain waktu tidak konsisten dan berpotensi menyesatkan.

Mengapa saya menggunakan 200 (OK)

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

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

dan jika daftarnya kosong, Anda bisa menjawab dengan sesuatu seperti ini (sambil tetap menggunakan a 200):

<users/>

Apa pun itu, klien menerima badan respons yang mengikuti format tertentu yang terkenal. Tidak ada kebingungan yang tidak perlu dan pemeriksaan kode status. 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.

toniedzwiedz
sumber
4
Sangat setuju. Dan untuk REST, saya hanya akan mengirim kembali kode status 200 dengan array kosong: [].
Chad Johnson
Masuk akal. Tidak perlu membuatnya lebih sulit. 404 akan membingungkan.
Witold Kaczurba
Mari kita asumsikan API yang menggambarkan koin di saku Anda, dengan titik akhir: GET /singleCoin- mengembalikan koin tunggal acak dari saku Anda, GET /severalCoins- mengembalikan beberapa koin dari saku Anda yang dapat Anda ambil dalam satu waktu. Katakanlah Anda tidak memiliki koin di saku Anda sekarang. Ketika Anda meminta GET /singleCoinAnda akan mendapatkan 404 Not Found, tetapi ketika Anda meminta GET /severalCoinsAnda akan mendapatkan 200 OKdengan daftar kosong []. Satu fakta - Anda tidak memiliki koin, dijelaskan dengan tanggapan berbeda, mengapa? Menurut saya lebih baik selalu mendapatkannya 404 Not Found, karena tidak ada koin yang ditemukan di saku Anda.
sempasha
1
@sempasha Itu tergantung pada apa yang Anda maksud dengan GET /severalCoins. Jika Anda mengamanatkan bahwa GET /severalCoins harus mengembalikan beberapa koin maka itu tidak boleh 200 karena itu tidak baik; server gagal memberikan apa yang diinginkan klien. Untuk /singleCoinini jelas karena klien menginginkan satu koin, tidak lebih, tidak kurang. Ini sama untuk /coins/7. Berbeda dengan /coinstitik akhir, biasanya klien tidak mengharapkan koin, satu koin, atau banyak koin. Semuanya adalah respon yang valid. Jika tidak ada koin, maka inilah yang mereka inginkan. Ini seperti sebuah kekosongan List<Coin>di Jawa, bukan null.
Franklin Yu
15

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

404 tidak ditemukan)

Jawaban ini cukup benar jika Anda tidak memiliki tabel. Bukan hanya meja kosong tapi NO USER TABLE. Ini menegaskan ide yang tepat - tidak ada sumber daya. Opsi lebih lanjut adalah memberikan rincian lebih lanjut MENGAPA tabel Anda tidak ada, ada beberapa kode yang lebih rinci tetapi 404 cukup bagus untuk merujuk pada situasi di mana Anda benar-benar tidak memiliki tabel.

200 (Oke)

Semua kasus di mana Anda memiliki tabel tetapi kosong atau pemroses permintaan Anda memfilter semua hasil. Ini berarti 'permintaan Anda benar, semuanya baik-baik saja 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 memilih 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 sesuai dengan permintaan Anda (data disaring karena keamanan tingkat objek tetapi secara umum Anda diizinkan untuk permintaan).

Roman Nikitchenko
sumber
10

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

kutu buku
sumber
2

pasti mengembalikan 200.

404 berarti sumber daya tidak ditemukan. Tetapi sumber daya itu ada. Dan juga jika responnya berstatus 404. Bagaimana Anda tahu daftar pengguna kosong atau terisi?


  • '/ users' jika kosong harus mengembalikan '200'.
  • '/ users / 1' jika id tidak ditemukan. harus mengembalikan 404.
Liva
sumber
2

Itu harus 200 OK dengan daftar kosong.

Mengapa: Tabel kosong berarti tabel tersebut ada tetapi tidak memiliki catatan apa pun.

404 Not Found berarti titik akhir yang diminta tidak ada.

Amir Raza
sumber