Doğru HTTP durum kodu yanlış girişe


170

200 (her şey yolunda değil) ancak girişte hata bildirmediğinde en uygun HTTP yanıt kodu nedir?

Örneğin, sunucuya bazı veriler gönderirsiniz ve verilerinizin yanlış olduğu yanıtlanır

kullanarak 500Sunucu Sorunu gibi daha görünüyor
kullanarak 200uyarı / hata yanıtı metin ile kötü (önbelleğe sağlayan ve her şey tamam değil) olduğu
kullanarak 204, hiçbir şey ve geri dönen (ama iyi desteklenen?) belki iyidir
kullanılarak 404istenen yol (script) mevcuttur ve eğer yanlış uygun yerde


Ayrıntılar için cevabımı görün stackoverflow.com/a/59527615/4127230
shiva2492

Yanıtlar:


211

API'mızı yaparken de aynı sorunu yaşadık. İle eşdeğer bir HTTP durum kodu arıyorduk InvalidArgumentException. Aşağıdaki kaynak makaleyi okuduktan sonra 422 Unprocessable Entityhangi durumları kullandık:

422 (İşlenemeyen Varlık) durum kodu, sunucunun istek varlığının içerik türünü anladığı (bu nedenle 415 (Desteklenmeyen Medya Türü) durum kodu uygun değildir) ve istek varlığının sözdiziminin doğru olduğu (dolayısıyla 400 (Hatalı İstek) anlamına gelir. ) durum kodu uygun değil), ancak içerdiği talimatları işleyemedi. Örneğin, bir XML istek gövdesi iyi biçimlendirilmiş (yani sözdizimsel olarak doğru), ancak anlamsal olarak hatalı XML talimatları içeriyorsa bu hata koşulu oluşabilir.

kaynak: https://www.bennadel.com/blog/2434-http-status-codes-for-invalid-data-400-vs-422.htm


138

4 (4xx) ile başlayan kodlar istemci hataları içindir. Belki 400 (Kötü İstek) bu davaya uygun olabilir mi? Http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html'deki tanım :

"İstek, hatalı biçimlendirilmiş sözdizimi nedeniyle sunucu tarafından anlaşılamadı. İstemci, değişikliği değişiklik yapmadan tekrarlamamalıdır."


13
400 Bad Requestfena değil, ancak genellikle hatalı biçimlendirilmiş sözdizimi için ayrılmalıdır. OP, iyi biçimlendirilmiş sözdizimi olan ancak geçersiz değerlere sahip bir vakadan daha fazla endişe duyuyor gibi görünüyor. Ayrıca 400, belirli bir hatalı giriş durumundan ayırt etmek isteyebileceğiniz oldukça yaygın bir "oh shit bir şey doğru değildi" yanıt kodudur.
Keego

4
İfadenin RFC 7231'de güncellendiğini ve "İstek, hatalı biçimlendirilmiş sözdizimi nedeniyle sunucu tarafından anlaşılamadı" olarak güncelleştirildi "sunucu, istemci olarak algılanan bir şey nedeniyle isteği işleyemiyor veya işleyemiyor hata (ör. hatalı biçimlendirilmiş istek sözdizimi, geçersiz istek iletisi çerçeveleme veya yanıltıcı istek yönlendirme) ".
Calimo

14

RFC Spesifikasyonuna ek olarak, bunu çalışırken de görebilirsiniz. Twitter yanıtlarına göz atın.

https://developer.twitter.com/en/docs/ads/general/guides/response-codes


19
Bağlantılarınızdan örnekler çıkarırsanız daha fazla oy alabilirsiniz.
Jared Thirsk


1
Benim için bağlantı ( fb-developers.info/tech/fb_dev/faq/general/gen_10.html ) rastgele bir reklama yol açar. Ben etki alanı sahte olduğunu düşünüyorum
dmitry502

@ dmitry502 Sahte bağlantıyı kaldırmak için düzenlendi. Yorumunuz için teşekkürler
Francis

9

409 Conflict kabul edilebilir bir çözüm olabilir.

Buna göre: https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

Kaynağın geçerli durumu ile bir çakışma nedeniyle istek tamamlanamadı. Bu koda yalnızca kullanıcının çakışmayı çözebileceği ve isteği yeniden gönderebileceği durumlarda izin verilir. Yanıt kuruluşu kullanıcının çatışmanın kaynağını tanıması için yeterli bilgi içermelidir. İdeal olarak, yanıt veren varlık, sorunu çözmek için kullanıcı veya kullanıcı aracısı için yeterli bilgi içerir; ancak bu mümkün olmayabilir ve gerekli değildir.

Doküman bir örnekle devam ediyor:

Çatışmaların bir PUT isteğine yanıt olarak ortaya çıkması muhtemeldir. Örneğin, sürüm oluşturma kullanılıyorsa ve PUT olan varlık, önceki (üçüncü taraf) bir istek tarafından yapılanlarla çakışan bir kaynakta değişiklikler içeriyorsa, sunucu, isteği tamamlayamayacağını belirtmek için 409 yanıtını kullanabilir . Bu durumda, yanıt veren varlık, iki tür arasındaki yanıtın Content-Type tarafından tanımlanan bir biçimde farklılıklarının bir listesini içerecektir.


Benim durumumda, bir API aracılığıyla bir veritabanına benzersiz olması gereken bir dize PUT istiyorum. Veritabanına eklemeden önce, veritabanında olmadığını kontrol ediyorum.

Eğer öyleyse, geri döneceğim "Error: The string is already in the database", 409.

Ben OP istediğini bu olduğuna inanıyorum: veri sunucunun kriterlerini geçmediğinde uygun bir hata kodu.


2

Aşağıdaki senaryoya göre,

Diyelim ki birisi sunucunuzdan doğru biçimdeki, ancak "iyi" veri olmayan verilerle bir istekte bulunuyor. Örneğin, birinin bir API uç noktasına bir String değeri bekleyen bir String değeri gönderdiğini düşünün; ancak, dizenin değeri kara listeye alınan verileri içeriyordu (ör. kişilerin şifre olarak "şifre" kullanmasını engelleme). durum kodu 400 veya 422 olabilir?

Şimdiye kadar, w3.org'a göre: "400 Kötü İstek" i geri verirdim:

İstek, hatalı biçimlendirilmiş sözdizimi nedeniyle sunucu tarafından anlaşılamadı. İstemci, değişiklik yapmadan isteği tekrarlamamalıdır.

Bu açıklama duruma tam olarak uymuyor; ancak, HTTP / 1.1 protokolünde tanımlanan temel HTTP durum kodları listesine giderseniz, muhtemelen en iyi seçeneğinizdir.

Ancak son zamanlarda, Dev ekibimden biri [bana] popüler API'lerin hata raporlarında daha ayrıntılı bilgi almak için HTTP uzantılarını kullanmaya başladığını belirtti. Özellikle Twitter ve Recurly gibi birçok API, WebDAV için HTTP uzantısında tanımlandığı gibi "422 İşlenemez Varlık" durum kodunu kullanıyor. HTTP durum kodu 422 şunları belirtir:

422 (İşlenemeyen Varlık) durum kodu, sunucunun istek varlığının içerik türünü anladığı (bu nedenle 415 (Desteklenmeyen Medya Türü) durum kodu uygun değildir) ve istek varlığının sözdiziminin doğru olduğu (dolayısıyla 400 (Hatalı İstek) anlamına gelir. ) durum kodu uygun değil), ancak içerdiği talimatları işleyemedi. Örneğin, bir XML istek gövdesi iyi biçimlendirilmiş (yani sözdizimsel olarak doğru), ancak anlamsal olarak hatalı XML talimatları içeriyorsa bu hata koşulu oluşabilir.

Yukarıdaki şifre örneğimize geri dönersek, bu 422 durum kodu çok daha uygun geliyor. Sunucu ne yapmaya çalıştığınızı anlar; ve gönderdiğiniz verileri anlar; verilerin işlenmesine izin vermez.


-7

404 - Bulunamadı - İstenen URI geçersiz veya kullanıcı gibi istenen kaynak mevcut olmadığında kullanılabilir.


2
OP zaten karar verdi: " 404 kullanarak istenen yol (script) mevcut ve uygun yerde yanlış "
Remy Lebeau
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.