Jawaban:
Status 422 tampaknya paling tepat berdasarkan spesifikasi .
Kode status 422 (Entitas yang Tidak Dapat Diproses) berarti server memahami jenis konten entitas permintaan (oleh karena itu kode status 415 (Jenis Media yang Tidak Didukung) tidak pantas), dan sintaks entitas permintaan benar (dengan demikian 400 (Permintaan Buruk) ) kode status tidak pantas) tetapi tidak dapat memproses instruksi yang terkandung. Sebagai contoh, kondisi kesalahan ini dapat terjadi jika badan permintaan XML berisi formulasi XML yang baik (yaitu, benar secara sintaksis), tetapi secara semestinya salah.
Mereka menyatakan bahwa xml cacat adalah contoh sintaksis yang buruk (membutuhkan 400). String kueri yang salah bentuknya analog dengan ini, jadi 400 sepertinya tidak cocok untuk string kueri yang terbentuk dengan baik dan tidak memiliki param.
UPDATE @DavidV dengan benar menunjukkan bahwa spesifikasi ini untuk WebDAV, bukan HTTP inti. Tetapi beberapa API non-WebDAV yang populer menggunakan 422, karena tidak ada kode status yang lebih baik ( lihat ini ).
400
lebih tepat.
Saya tidak yakin ada standar yang ditetapkan, tetapi saya akan menggunakan 400 Permintaan Buruk , yang mendokumentasikan spesifikasi HTTP terbaru (dari 2014) sebagai berikut :
6.5.1. 400 permintaan BurukKode status 400 (Permintaan Buruk) menunjukkan bahwa server tidak dapat atau tidak akan memproses permintaan karena sesuatu yang dianggap sebagai kesalahan klien (misalnya, sintaks permintaan salah bentuk, pembingkaian pesan permintaan tidak valid, atau perutean permintaan yang menipu).
400 Bad Request
dimaksudkan untuk menunjukkan masalah tingkat protokol, bukan kesalahan semantik. Jika kita akan membajak kode status HTTP untuk menunjukkan kesalahan tingkat aplikasi (bukan tingkat protokol), mengapa tidak berjalan terus dan gunakan saja 412
?
The WCF API di NET menangani hilang parameter dengan mengembalikan sebuah HTTP 404
kesalahan "Endpoint Tidak Ditemukan", ketika menggunakan webHttpBinding .
Masuk 404 Not Found
akal jika Anda mempertimbangkan nama metode layanan web Anda bersama-sama dengan tanda tangan parameternya. Artinya, jika Anda mengekspos metode layanan web LoginUser(string, string)
dan Anda meminta LoginUser(string)
, yang terakhir tidak ditemukan.
Pada dasarnya ini berarti bahwa metode layanan web yang Anda panggil, bersama dengan tanda tangan parameter yang Anda tentukan, tidak dapat ditemukan.
10.4.5 404 Tidak Ditemukan
Server belum menemukan sesuatu yang cocok dengan Permintaan-URI. Tidak ada indikasi yang diberikan apakah kondisinya sementara atau permanen.
The 400 Bad Request
, seperti Gert menyarankan , tetap kode respon yang valid, tapi saya pikir itu biasanya digunakan untuk menunjukkan masalah-tingkat yang lebih rendah. Itu bisa dengan mudah diartikan sebagai permintaan HTTP yang cacat, mungkin header HTTP yang hilang atau tidak valid, atau serupa.
10.4.1 400 Permintaan Buruk
Permintaan tidak dapat dipahami oleh server karena sintaksis yang salah. Klien TIDAK HARUS mengulangi permintaan tanpa modifikasi.
Anda dapat mengirim 400 kode Permintaan Buruk. Ini adalah salah satu kode status 4xx untuk keperluan umum, jadi Anda dapat menggunakannya untuk maksud yang Anda inginkan: klien mengirim permintaan yang kehilangan informasi / parameter yang diperlukan aplikasi Anda untuk memprosesnya dengan benar.
Dalam salah satu proyek API kami, kami memutuskan untuk menetapkan Status 409 untuk beberapa permintaan, ketika kami tidak dapat mengisinya penuh pada 100% karena parameter yang hilang.
Kode Status HTTP "409 Konflik" bagi kami merupakan upaya yang baik karena definisinya perlu menyertakan informasi yang cukup bagi pengguna untuk mengenali sumber konflik.
Referensi: w3.org/Protocols/
Jadi di antara tanggapan lain seperti 400 atau 404 kami memilih 409 untuk menegakkan kebutuhan untuk melihat beberapa catatan dalam permintaan yang membantu untuk membuat permintaan baru dan benar.
Bagaimanapun kasus kami adalah khusus karena kami harus mengirimkan beberapa data sebelum permintaan itu tidak sepenuhnya benar, dan kami perlu menegakkan klien untuk melihat pesan dan memahami apa yang salah dalam permintaan.
Secara umum jika kita hanya memiliki beberapa parameter yang hilang kita pergi untuk 400 dan array parameter yang hilang. Tetapi ketika kita perlu mengirim lebih banyak informasi, seperti pesan kasus tertentu dan kami ingin lebih yakin klien akan mengurusnya, kami mengirim 409
Saya biasanya menggunakan 422 (entitas yang tidak dapat diproses) jika sesuatu dalam parameter yang diperlukan tidak cocok dengan apa yang diperlukan API endpoint (seperti kata sandi yang terlalu pendek) tetapi untuk parameter yang hilang saya akan memilih 406 (Tidak dapat diterima).
Accept-Language: de
, menunjukkan bahwa itu hanya akan menerima tanggapan dalam bahasa Jerman, tetapi satu-satunya versi dokumen yang diminta yang tersedia di server Anda adalah dalam bahasa Inggris atau Prancis.) Menggunakannya untuk menunjukkan parameter yang hilang dalam permintaan tidak benar, sesuai definisi dalam spesifikasi.
Bagi mereka yang tertarik, Spring MVC (setidaknya 3.x) mengembalikan 400 dalam hal ini, yang tampaknya salah bagi saya.
Saya menguji beberapa URL Google (accounts.google.com) dan menghapus parameter yang diperlukan, dan mereka umumnya mengembalikan 404 dalam kasus ini.
Saya akan menyalin Google.
Dapat dikatakan bahwa a 404 Not Found
harus digunakan karena sumber daya yang ditentukan tidak dapat ditemukan.
Saya sering menggunakan 403 Forbidden error. Alasannya adalah bahwa permintaan itu dipahami, tetapi saya tidak akan melakukan seperti yang diminta (karena semuanya salah). Entitas respons menjelaskan apa yang salah, jadi jika responsnya adalah halaman HTML, pesan kesalahan ada di halaman. Jika respons JSON atau XML, informasi kesalahan ada di sana.
Dari rfc2616 :
10.4.4 403 Dilarang
Server mengerti permintaan itu, tetapi menolak untuk memenuhinya.
Otorisasi tidak akan membantu dan permintaan TIDAK HARUS diulang.
Jika metode permintaan itu bukan KEPALA dan server ingin mengumumkan kepada
publik mengapa permintaan itu belum terpenuhi, itu HARUS menggambarkan alasan penolakan di entitas. Jika server tidak ingin membuat informasi ini tersedia untuk klien, kode status 404
(Tidak Ditemukan) dapat digunakan sebagai gantinya.
Authorization will not help
, jadi Twitter tidak boleh mengirim ini untuk kredensial OAuth yang tidak valid.
401 Unauthorized
gantinya. Namun, Anda dapat memahami mengapa mereka tidak melakukannya jika Anda melihat deskripsi dokumen MDN tentang kedua kode ini, yang sangat mirip.
Hanya untuk menggunakan ASP.NET Core sebagai referensi atau contoh, ASP.NET Core memungkinkan Anda merancah pengontrol dengan tindakan, ini adalah bagaimana tindakan "Rincian" terlihat.
// GET: Cars/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var car = await _context.Cars.FirstOrDefaultAsync(m => m.CarId == id);
if (car == null)
{
return NotFound();
}
return View(car);
}
Jika parameter id
tidak disetel, maka mengembalikan 404 Tidak Ditemukan.
Kembalikan 404 - yang berarti sumber daya tidak dapat ditemukan.
Coba edit url situs yang berisi id. Saya mencoba beberapa:
Semua kembali 404, imo karena para pengembang menafsirkan standar dengan benar, yang jawabannya di sini dan banyak lainnya, tidak!
requestBody
.
Saya akan pergi dengan 403.
Dari RFC 2616 - Protokol Transfer Hiperteks - HTTP / 1.1
403 Dilarang
Server mengerti permintaan itu, tetapi menolak untuk memenuhinya. Otorisasi tidak akan membantu dan permintaan TIDAK HARUS diulang. Jika metode permintaan itu bukan KEPALA dan server ingin mengumumkan kepada publik mengapa permintaan itu belum terpenuhi, itu HARUS menggambarkan alasan penolakan di entitas. Jika server tidak ingin membuat informasi ini tersedia untuk klien, kode status 404 (Tidak Ditemukan) dapat digunakan sebagai gantinya.
Anda harus menjelaskan alasan kegagalan dalam respons Anda. Jika Anda memilih untuk tidak melakukannya, gunakan saja 404.