Doğrulama hatası için bir REST API hizmeti tarafından döndürülecek uygun bir HTTP durum kodu nedir?


394

Şu anda benim Django / Piston tabanlı REST API uygulamasında bir doğrulama hatasıyla karşılaştığımda 401 Yetkisiz olarak geri dönüyorum . HTTP Durum Kodu Kayıt Defterine bir göz attığımda, bunun bir doğrulama hatası için uygun bir kod olduğuna ikna olmadım, ne tavsiye edersiniz?

  • 400 Hatalı İstek
  • 401 Yetkisiz
  • 403 yasak
  • 405 Yönteme İzin Verilmiyor
  • 406 Kabul Edilemez
  • 412 Önkoşul Başarısız
  • 417 Beklenti Başarısız
  • 422 İşlenemeyen Varlık
  • 424 Başarısız Bağımlılık

Güncelleme : Yukarıdaki "Doğrulama hatası", uygulama düzeyinde veri doğrulama hatası, yani yanlış belirlenen tarih, sahte e-posta adresi vb. Anlamına gelir.



3
Kenny'nin bağlantısı Fwiw, Jim'in cevabı şimdi aşağıda olduğu gibi 422 kodunu öneriyor . #TheMoreYouKnow #SavingYouAClick
Ruffin

Bence 401 daha açık.
nişan

Yanıtlar:


298

"Doğrulama hatası", istekte bazı istemci hatası olduğu anlamına gelirse, HTTP 400 (Hatalı İstek) kullanın. Örneğin, URI'nin ISO-8601 tarihine sahip olması gerekiyorsa ve bunun yanlış biçimde olduğunu veya 31 Şubat'a başvurduğunu görürseniz, HTTP 400 döndürürsünüz. Bir varlık gövdesinde iyi biçimlendirilmiş XML ve ayrıştırılamıyor.

(1/2016): Son beş yıl içinde WebDAV'ın daha spesifik HTTP 422 (İşlenemeyen Varlık) HTTP 400'e çok makul bir alternatif haline geldi. Örneğin JSON API'sındaki kullanımına bakın . Ama HTTP 422 olduğunu not do not HTTP 1.1 dönüfltürmüfl, RFC-7231 .

Richardson ve Ruby'nin RESTful Web Hizmetleri , çeşitli HTTP yanıt kodlarının ne zaman kullanılacağına dair çok yararlı bir ek içerir. Onlar söylüyor:

400 (“Kötü İstek”)
Önem: Yüksek.
Bu, başka bir 4xx hata kodu uygun olmadığında kullanılan genel istemci tarafı hata durumudur. Genellikle istemci bir PUT veya POST isteğiyle birlikte bir temsil gönderdiğinde ve temsil doğru biçimde olduğunda, ancak bu bir anlam ifade etmediğinde kullanılır. (s. 381)

ve:

401 (“Yetkisiz”)
Önemi: Yüksek.
İstemci, uygun kimlik doğrulama bilgilerini sağlamadan korumalı bir kaynak üzerinde çalışmaya çalıştı. Yanlış kimlik bilgileri sağlamış olabilir veya hiç girmemiş olabilir. Kimlik bilgileri, söz konusu hizmet ne olursa olsun bir kullanıcı adı ve parola, bir API anahtarı veya bir kimlik doğrulama belirteci olabilir. Bir istemcinin URI için istekte bulunması ve 401'i kabul etmesi yaygındır, böylece ne tür kimlik bilgilerini ve hangi biçimde gönderileceğini bilir. [...]


3
Ancak muhtemelen URI biçimi geçersizse 404 daha uygun olabilir.
manu

11
@ReWrite tarafından belirtildiği gibi, 422 doğrulama hataları için daha iyi olduğunu düşünüyorum.
panteo

11
Bunun yanlış olduğunu söyleyebilirim. 400 Hatalı İstek, sözdiziminde sözdizimsel olarak yanlış bir şey olduğunda kullanılır. ReWrite, isteğin içeriği ile ilgili 422 tavsiye konusunda haklı olduğunu söyleyebilirim .
Stijn de Witt

3
@Kenji yes, 401 (“Yetkisiz”): "Yanlış kimlik bilgileri vermiş olabilir ..." yanlış kullanıcı ve / veya şifre anlamına gelir.
razzintown

4
@JimFerrans 400 hataları, sözdiziminin yanlış olduğu yerler içindir. 401 hataları özellikle erişmek için giriş yapmam gereken bir sayfaya erişmeye çalışıyorsam ve hiç giriş yapmıyorsam. 422 hataları sözdiziminin doğru olduğu yerdir, ancak sunucu hizmeti reddediyor. Yanlış kullanıcı adı / şifre doğru sözdizimi (400 hatası değil) ve giriş sayfasının kendisine (401 hatası değil) eriştiğim için giriş yapmam gereken bir sayfaya erişmeye çalışmıyorum. 401 hatası, yalnızca bir kullanıcının erişebileceği ayarlar sayfası gibi bir şey için kullanılmalıdır
Zachary Weixelbaum

98

RFC 4918'den (ve ayrıca http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml adresinde belgelenmiştir ):

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.


6
422 - 400'den fazla doğrulama hatası için
İşlenemez


19

İşte burada:

rfc2616 # bölüm-10.4.1 - 400 Hatalı İstek

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

rfc7231 # bölüm-6.5.1 - 6.5.1. 400 Hatalı İstek

400 (Hatalı İstek) durum kodu, sunucunun, istemci hatası olarak algılanan bir şey (örneğin, hatalı biçimlendirilmiş istek sözdizimi, geçersiz istek iletisi çerçeveleme veya aldatıcı istek yönlendirmesi) nedeniyle isteği işleyemeyeceğini veya işlemeyeceğini gösterir .

Hatalı (iyi biçimlendirilmemiş) vakaları ifade eder!

rfc4918 - 11.2. 422 İşlenemeyen Varlı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 .

Sonuç

Temel kural: [_] 00 en genel durumu ve belirlenen kod kapsamında olmayan durumları kapsar.

422 en iyi nesne doğrulama hatasına uyar (tam olarak benim tavsiyem :) Anlamsal olarak hatalı -
gelince - doğrulama "Bu kullanıcı adı zaten mevcut" gibi bir şey düşünün.

400 nesne doğrulaması için yanlış kullanılıyor


9

Teknik olarak HTTP hatası olmayacağını söyleyebilirim, çünkü kaynak (muhtemelen) geçerli bir şekilde belirtildi, kullanıcının kimliği doğrulandı ve hiçbir operasyonel hata yoktu (ancak spec bile 402 Ödeme Gerekli gibi bazı ayrılmış kodları içeriyor t Net bir şekilde HTTP ile ilgili olsa da, herhangi bir cihazın durumu tanıyabilmesi için protokol düzeyinde olması tavsiye edilebilir).

Aslında durum buysa, yanıta uygulama hatalarıyla birlikte bir durum alanı eklerdim.

<status><code>4</code> <message> Tarih aralığı geçersiz </message> </status>


1

HTTP 1.1'i belgeleyen RFC 2616'da bu hataların anlambilimi hakkında biraz daha bilgi var .

Şahsen, muhtemelen kullanırım 400 Bad Request, ama bu herhangi bir gerçek destek olmadan sadece benim kişisel görüşüm.


0

"Doğrulama hatası" ile tam olarak ne demek istiyorsun? Neyi doğrulıyorsun? Sözdizimi hatası (ör. Hatalı biçimlendirilmiş XML) gibi bir şeye mi başvuruyorsunuz?

Eğer durum buysa, 400 Kötü İstek'in muhtemelen doğru olduğunu söyleyebilirim, ama ne olduğunu bilmeden “doğrulamakta olduğunuzu” söylemek mümkün değildir.


bazı işletme doğrulamalarını veya kurallarını doğrulamaya çalışıyorsak.
Metalhead
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.