Saya akan menjelaskan sebuah contoh:
Saya mulai membuat API untuk toko kue. API akan memungkinkan orang untuk mencari catalogus mereka untuk membuat produk kue, seperti cookie chocolate chip buatan sendiri api.examplebakery.com/search?q=.....
.
Seseorang menggunakan ini untuk mencari produk bernama pineapple-banana flavoured cookies
dan jelas tidak akan menemukan hasil.
Haruskah ini dikembalikan sebagai kesalahan? Pencarian tidak gagal, API mencari dan berhasil menyimpulkan tidak ada cookie yang dapat ditemukan. API tidak boleh kembali 404
, karena memang API itu ditemukan.
rest
http-response
Berry M.
sumber
sumber
Jawaban:
Ketika ada hasil, hasilnya adalah daftar (JSON, berdasarkan komentar Anda). Untuk pertanyaan tanpa hasil, output harus persis sama. Daftar sederhana memiliki 0 item di dalamnya.
Jadi jika respons Anda seperti ini:
Maka untuk kueri dengan 0 hasil, seharusnya ini:
Jika Anda juga memasukkan meta data tentang berapa "halaman" hasil yang ada, tautan ke "halaman" itu, dll. Maka saya sarankan mengatakan ada 1 "halaman".
Status HTTP harus sama dengan ketika ada hasil -
200 OK
.204 No Content
mungkin juga tampaknya menjadi pilihan, tetapi itu bukan karena Anda sebenarnya mengembalikan "konten" - daftar kosong. Jika Anda merasa daftar kosong tidak dihitung sebagai "konten", bagaimana jika Anda kemudian mengubah respons untuk menawarkan saran ejaan? Inti dari respons masih akan menjadi daftar kosong, tetapi sekarang ada lebih banyak "konten".Untuk informasi lebih berguna tentang kode status HTTP, jpmc26 jawabannya layak dibaca.
sumber
Setiap kali memutuskan kode HTTP, Anda harus selalu menanyakan pertanyaan ini:
Selalu tentukan kisaran kode respons Anda yang seharusnya berada di urutan pertama. Melakukannya dengan cepat menghilangkan banyak kode respons sebagai opsi, dan (mungkin lebih penting) membuatnya mengikuti semantik kode menjadi lebih sederhana. Lihat bagian awal dokumentasi kode HTTP untuk penjelasan tentang apa yang diwakili oleh setiap kategori kode.
Dalam kasus ini, klien meminta daftar hasil yang diberikan filter dari titik akhir yang valid dan sudah ada dan memiliki izin untuk mengaksesnya. Server dapat memproses permintaan dan menentukan data yang sesuai untuk dikembalikan (tanpa item), sehingga permintaan berhasil. Kebetulan filter yang mereka berikan menyaring semua hasil. Tidak tergantung pada server untuk menentukan apakah ini yang diinginkan klien atau tidak, karena ini mungkin hasil yang diharapkan untuk beberapa klien. Jika ini merupakan masalah bagi kode klien, itu adalah tanggung jawab klien untuk menentukan, memeriksa, dan menangani dengan tepat. Jadi ini jelas 2xx.
Sekarang pertanyaannya adalah, "2xx yang mana?" Ini tergantung pada bagaimana Anda ingin server merespons.
Yang lain tidak berlaku sama sekali:
Jadi itu harus 200 atau 204, dan 200 lebih cenderung mengarah pada kode klien yang lebih sederhana dan lebih kuat (terutama jika Anda menggunakan struktur respons yang konsisten yang berisi daftar kosong).
sumber
null
mana biasanya ada daftar), Anda tidak akan menuai manfaat konsistensi bahkan dengan 200. Namun, apa yang saya jelaskan menggunakan respons yang konsisten dengan struktur normal dan memiliki daftar kosong tempat daftar hasil biasanya pergi. 204 mengambil setiap peluang untuk mendapat tanggapan yang konsisten. Juga, bahkan di pustaka klien HTTP yang memiliki fungsi kenyamanan untuk itu, Anda sering (biasanya?) Harus membuat panggilan eksplisit untuk mem-parse JSON.Tidak. Penggunaan 404 untuk menunjukkan 'permintaan Anda diproses tetapi tidak ada kecocokan' mengerikan karena:
aliran bersyarat berdasarkan penanganan pengecualian (mis. memaksa hasil yang tidak luar biasa untuk membuat dan menangani pengecualian pada klien yang dapat menjadi tidak berkinerja dan canggung)
ambiguitas antara halaman 'nyata' tidak ditemukan, Anda mengetik kesalahan titik akhir salah
Yang perlu diingat adalah bahwa selalu ada klien untuk membatalkan deserialisasi pesan dan apa yang dikembalikan oleh klien itu penting; bukan serialisasi.
Jika klien harus mengembalikan nol, maka gunakan serialisasi dari nol. Jika klien harus mengembalikan array kosong, gunakan [], jika klien harus melempar kesalahan gunakan 500 dan sampaikan pesan kesalahan
sumber
Beyond @ Ewan jawaban yang sangat bagus:
Jika kueri adalah jenis yang mengembalikan set hasil, maka set kosong secara logis sama layaknya dengan set satu, atau set lebih banyak. Secara umum untuk alasan yang menyatakan @wan, tidak ada salahnya lebih baik untuk mengubah set kosong menjadi kesalahan, dan, itu sama sekali tidak perlu.
Jika kueri adalah jenis yang mencari dan mengembalikan singleton spesifik (yang diharapkan akan ditemukan, misalnya kecocokan dengan id), maka tidak ditemukan adalah respons yang mungkin secara logis sesuai.
sumber
Anda mengasumsikan kode harus mengambil tindakan khusus ketika tidak ada data yang dikembalikan, tetapi itu mungkin tidak terjadi. Kode mungkin hanya mencari jumlah produk, atau menambahkan hasilnya ke daftar atau sejumlah hal. Anda seharusnya hanya memberi "kesalahan" kepada pengguna jika sebenarnya ada kesalahan.
sumber
Ketika saya menggunakan API, sebagai klien saya harus menangani kasus "sukses" berbeda dari kasus "kesalahan"; Saya tidak punya pilihan di sana. Oleh karena itu, Anda harus mengembalikan kesalahan dalam situasi yang ingin diperlakukan berbeda oleh klien , dan sukses dalam situasi yang ingin diperlakukan sama oleh klien .
Jika saya melakukan kueri yang secara teori dapat mengembalikan sejumlah hasil, nol, satu, dua ratus dan seterusnya, maka Anda harus mengembalikan "sukses" setiap kali API memberikan daftar lengkap semua hasil. Dan mungkin dalam kasus di mana ada banyak hasil, Anda mengembalikan sebagian daftar hasil untuk menghindari ukuran yang berlebihan, dan ada cara yang disepakati bagaimana saya akan mendapatkan hasil lainnya. Itu karena sebagai klien, saya sering ingin menangani kasus hasil nol seperti kasus hasil lebih banyak. Saya mungkin memperlakukannya secara berbeda, tetapi saya tidak mau dipaksa.
Ini berbeda dalam hal saya mencari nilai. Saya mengharapkan satu hasil, nilai yang saya cari. Dan saya membutuhkan satu hasil untuk melanjutkan apa yang ingin saya lakukan dengan cara yang bermakna. Di sini jauh lebih dapat diterima untuk mengembalikan status 404 untuk kasus yang tidak ada nilainya di sana, karena saya memang perlu menangani kasus itu secara berbeda.
Ringkasan: Jika klien mengharapkan sejumlah hasil, dari nol hingga jumlah besar, maka kembalikan "sukses" jika semua hasil dikirimkan, bahkan jika jumlahnya nol. Jika klien mengharapkan tepat satu hasil, maka kembalikan sukses jika hasilnya ditemukan, dan kesalahan jika hasilnya tidak ditemukan.
sumber