İstekte gerekli bir parametre eksikse hangi HTTP durum yanıt kodunu kullanmalıyım?


Yanıtlar:


388

Durum 422 en çok spesifikasyona göre uygun görünüyor .

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.

Hatalı biçimlendirilmiş xml'nin kötü sözdiziminin bir örneği olduğunu belirtirler (400 çağrısında bulunur). Hatalı biçimlendirilmiş bir sorgu dizesi buna benziyor, bu yüzden 400 bir param eksik olan iyi biçimlendirilmiş bir sorgu dizesi için uygun görünmüyor.

UPDATE @DavidV, bu özelliğin çekirdek HTTP için değil, WebDAV için olduğunu doğru bir şekilde gösteriyor. Ancak bazı popüler WebDAV olmayan API'ler, daha iyi bir durum kodunun bulunmaması nedeniyle yine de 422 kullanıyor (buna bakın ).


2
IMO Sorgu dizesindeki değer yanlış olduğunda, fazladan bir değer veya eksik bir değer olmadığında bunu kullanırdım. yani. Bir e-posta ve değeri bekleniyor '123123'
Derek Litz

2
Bir GET ve POST parametrelerini URL yolunun yöntem imzası olarak düşünme eğilimindeyim, bu yüzden 404 bana mantıklı geliyor. Kamu tüketimi anlamına gelen RESTful API'sinde eksik / ekstra parametreleri döndürmek ihtiyatlıdır. Bir URL bağlamında, sorgu dizesi parametreleri genellikle bir kaynağı tanımlamak için önemlidir ve fazladan ya da eksik parametreler, herhangi bir varsayım olmaksızın var olmayan bir kaynağı temsil eder. Tabii ki, açık olarak sağlamlığı olan değiş tokuşlar vardır ve isteğe bağlı parametreler bir kaynağı potansiyel olarak sessiz hataya karşı savunmasız hale getirir. Sonra kullanılabilirlik var ...
Derek Litz

13
Başvurulan özellik WebDAV içindir ve HTTP standart özelliği değildir.
David V

1
@Kelvin Blog gönderisine dikkat çektiğiniz için teşekkür ederiz. Örneğin Twitter'ın 422 kullandığını görmek yardımcı olur. İlk satırda spesifikasyonun WebDAV olduğunu açıklarsanız yanıt daha iyi olabilir. Cevabınızı ilk okuduğumda, bağlantıyı takip edene kadar HTTP standart spesifikasyonunu kastettiğinizi düşündüm.
David V

3
Bu bir okumaya değer: bennadel.com/blog/… Ben de 422 eksik param için kullanmak olmaz. Bence 400daha uygun.
Zelphir Kaltstahl

184

Belirlenmiş bir standart olduğundan emin değilim, ancak en son HTTP spesifikasyonunun (2014'ten itibaren) aşağıdaki gibi belgelerini içeren 400 Kötü İstek'i kullanırdım :

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.


65
400 Bad Requestanlamsal hataları değil, protokol düzeyindeki sorunları belirtmek içindir. Uygulama düzeyinde (protokol düzeyinde değil) hataları belirtmek için HTTP durum kodlarını ele geçireceksek, neden sonuna kadar gidip kullanmıyorsunuz 412?
Matt Zukowski

36
Google'ın OAuth 1.0 uygulaması bu yanıta katılıyor. POST parametreleri eksik veya desteklenmiyorsa 400 yanıtı verilir: code.google.com/apis/accounts/docs/OAuth_ref.html
Tom

1
@ matt-zukowski: "412: İstek başlığı alanlarından bir veya daha fazlasında verilen önkoşul sunucuda test edildiğinde false olarak değerlendirildi." dan RFC2616 - bir POST ise, parametreler isteği gövdesine değil istek başlığı-alanları içindedir. Teknik olarak, GET yöntemi parametrelerini istek başlıklarında gönderir, ancak bunun yerine biraz tutarlılık ister miydim?
toong

6
@MattZukowski 400 bir uygulama seviyesi durum kodudur. RFC 7231'in taslak versiyonundaki yeniden düzenlemeye bakarsanız, bunu göreceksiniz. Ne yazık ki, en son sürümdeki ifade o kadar net değil çünkü en son değişikliklerin yazarı da 422 icat etti.
Darrel Miller

9
@DarrelMiller haklı ( doğrudan bağlantı ): "400 (Hatalı İstek) durum kodu, sunucunun bir istemci hatası olarak algılanan bir şey (örneğin, hatalı biçimlendirilmiş istek sözdizimi, geçersiz istek iletisi) nedeniyle isteği işleyemeyeceğini veya işlemeyeceğini gösterir çerçeveleme veya aldatıcı istek yönlendirme). " Anlambilim ve genişletilebilirlik beklentilerine bağlı olarak (bir gün parametre olmadan bir istek yayınlamak mümkün olacak mı?) O zaman standart HTTP'de sadece 400 ve 404 uygun görünmektedir. Aksi takdirde, API'nız için yeni bir kod icat edin, ancak anlambilimi aşırı yüklemeyin.
tne

31

WCF API NET kulpları bir döndürerek parametreleri eksik HTTP 404kullanırken, "Son nokta Bulunamadı" hatası WebHttpBinding .

404 Not FoundOnun parametre imzayla birlikte web hizmeti yöntem adı düşünülürse mantıklı olabilir. Yani, bir web hizmeti yöntemini açığa çıkarır LoginUser(string, string)ve talep ederseniz LoginUser(string), ikincisi bulunmaz.

Temel olarak bu, aradığınız web hizmeti yönteminin, belirttiğiniz parametre imzasıyla birlikte bulunamadığı anlamına gelir.

10.4.5 404 Bulunamadı

Sunucu, İstek URI'sı ile eşleşen bir şey bulamadı. Koşulun geçici mi yoksa kalıcı mı olduğuna dair herhangi bir gösterge yoktur.

400 Bad RequestGibi Gert önerdi , geçerli bir yanıt kodu kalır, ama normalde alt düzey sorunları belirtmek için kullanılır düşünüyorum. Kolayca hatalı biçimlendirilmiş bir HTTP isteği, eksik veya geçersiz HTTP üstbilgileri veya benzeri olarak yorumlanabilir.

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.


CherryPy varsayılan olarak bunu yapar.
Derek Litz

Bir modeli kabul ettiğiniz ve modelin bir kısmının eksik olduğu bir gönderi isteğini ele alırken ne olur? Bu durumda 404 almazsınız. Bunun yerine, yanılmıyorsam geçerli olmayan bir model alırsınız ve şimdi ne yapacağınıza karar vermeniz gerekir.
Shane Courtrille

1
Bu yorum bir streç gibi görünüyor ve bir REST pov yerine bir RPC ifade ediyor. URI tanımlayıcıdır ve vardır ve bulunmuştur. Gövdede gönderilenler kaynak tanımlayıcısının bir parçası değildir. 422 daha uygundur.
Jonah

404 doğru cevap, sadece fikir birliğini bulmak için web üzerinde bazı urls düzenleme gidin!
jenson-button-event

8

400 Hatalı İstek kodu gönderebilirsiniz. Daha genel amaçlı 4xx durum kodlarından biridir, bu yüzden ne istediğinizi ifade etmek için kullanabilirsiniz: istemci, doğru bir şekilde işlemek için uygulamanızın gerektirdiği bilgi / parametreleri eksik bir istek gönderiyor.


7

API projemizden birinde, eksik parametre nedeniyle% 100'de tam olarak dolduramadığımızda bazı isteklere 409 Durumu ayarlamaya karar veriyoruz.

HTTP Durum Kodu "409 Çakışma" bizim için iyi bir denemeydi çünkü tanımı kullanıcının çakışmanın kaynağını tanıması için yeterli bilgi içermesini gerektiriyor.

Referans: w3.org/Protocols/

400 veya 404 gibi diğer yanıtların yanı sıra, yeni ve doğru bir istek oluşturmaya yardımcı olan istekte bazı notlara bakma ihtiyacını zorlamak için 409'u seçtik.

Her durumda bizim durumumuz özeldi, çünkü istek tamamen doğru değilse bazı veriler göndermemiz gerekiyor ve istemciye iletiye bakıp istekte neyin yanlış olduğunu anlaması için zorlamalıyız.

Genel olarak sadece eksik bir parametremiz varsa , 400 ve eksik parametre dizisi için gidiyoruz . Ancak, belirli bir vaka mesajı gibi daha fazla bilgi göndermemiz gerektiğinde ve müşterinin bununla ilgileneceğinden daha emin olmak istediğimizde, bir 409 göndeririz


2
Bu çok yanlış. @ MaximeGélinas, bir kaynağın zaten mevcut olduğu ve kopyalara izin verilmediği durumlar için 409 eşzamanlılık sorunları içindir.
gimlichael

Spesifikasyonlara göre, "409 (Çakışma) durum kodu, hedef kaynağın geçerli durumu ile bir çakışma nedeniyle isteğin tamamlanamayacağını gösterir." . Eksik bir parametre için kullanmak yanlıştır; bu tamamen farklı bir hata.
Mark Amery

5

I Gerekli parametrelerdeki bir şey API uç noktasının (çok kısa bir parola gibi) gerekenle eşleşmediği halde 422 (İşlenemez varlık) için gider, ancak eksik bir parametre için 406 (Kabul Edilemez) için giderim.


8
Eh, 406 Kabul Edilemez Kabul üstbilgisi ile kullanılır (sunucu istemcinin anlayacağı yanıt gönderemezse). "İstek tarafından tanımlanan kaynak, yalnızca istekte gönderilen kabul başlıklarına göre kabul edilemez içerik özelliklerine sahip yanıt veren varlıklar oluşturabilir." . Mevcut spesifikasyonda "doğru" bir seçim olmadığı için 422 ile takılıp kaldım: - /
JakubKnejzlik

Bunun için 406 kullanmak yanlış. 406 kodu, isteğin kabul edilemez olduğu anlamına gelmez ; bu, isteği yerine getiremeyeceğiniz anlamına gelir; çünkü sunabileceğiniz yanıtlar , istekte gönderdiği Kabul başlıklarına dayanarak müşterinin kabul edilemez bulacağı yanıtlardır . (Örneğin Accept-Language: de, yalnızca Almanca yanıtları kabul edeceğini belirten istek dahil edilmiştir , ancak sunucunuzda kullanılabilen istenen belgenin yalnızca sürümleri İngilizce veya Fransızca'dır.) İstekte eksik bir parametrenin yanlış olduğunu belirtmek için bunu kullanma, spec tanımına göre.
Mark Amery

3

İlgilenenler için, Spring MVC (en az 3.x) bu durumda 400'ü döndürüyor, bu da benim için yanlış görünüyor.

Birkaç Google URL'sini (accounts.google.com) test ettim ve gerekli parametreleri kaldırdım ve bu durumda genellikle 404 döndürüyorlar.

Google'ı kopyalarım.


18
Google bunu yaptığı için otomatik olarak Google'ın doğru yaptığı anlamına gelmez!
rve

4
Katılıyorum, ille de 'doğru' değil, bazen doğru ve mantıklı olan iki farklı şeydir. Her neyse .. okuyucuya kadar :)
Neromancer

Bazı Google API'ları 400 döndürür, örneğin github.com/google/google-api-nodejs-client/issues/404
Dennis

bu yanlış (ve neden bahar mvc jax-rs uyumlu değil)
jenson-button-event

3

404 Not FoundBelirtilen kaynak bulunamadığı için a'nın kullanılması gerektiği söylenebilir.


3
Bir sorgu parametresi uygun veri tipine dönüştürülemediğinde, Java JAX-RS'nin varsayılan davranışı budur. Ben de buna katılmıyorum. Kaynak WAS bulundu: sorgu parametreleri kaynağı filtrelemek içindir ve filtrelerden birine kabul edilemez bir değer verilmiştir. Sanırım bu en yakın 422 İşlenemez Varlık ve en yakın 400 Kötü İstek ile eşleşiyor.
Ryan

onun doğru davranış çünkü jax-rs varsayılan davranışı!
jenson-button-event

Sorgu dizesi parametresi bir kaynağı tanımlamak istediğinde 404 kullanmak makuldür, bir değer verildi, ancak bu değer var olan bir kaynağa karşılık gelmiyor - örneğin, example.com/show-user talep ediyorsanız -profile? user_id = 123 ve 123 kullanıcısı mevcut değil. Ancak bu soru böyle sormadı; gerekli bir parametrenin tamamen atlandığı senaryo ile ilgiliydi. Bunun belirli bir kaynağa nasıl karşılık gelmediğini göremiyorum.
Mark Amery

2

Sıklıkla 403 Yasak hata kullanıyorum. Nedeni, isteğin anlaşılmış olmasıdır, ancak istendiği gibi yapmayacağım (çünkü işler yanlıştır). Yanıt varlığı neyin yanlış olduğunu açıklar, bu nedenle yanıt bir HTML sayfasıysa, hata iletileri sayfadadır. Bir JSON veya XML yanıtıysa, hata bilgisi oradadır.

Gönderen RFC2616 :

10.4.4 403 Yasak

Sunucu isteği anladı, ancak yerine getirmeyi reddediyor.
Yetkilendirme yardımcı olmaz ve istek tekrarlanmamalıdır.
İstek yöntemi HEAD değilse ve sunucu
, isteğin neden yerine getirilmediğini halka duyurmak istiyorsa, kuruluştaki ret nedenini açıklamalıdır. Sunucu bu bilgileri istemcinin kullanımına açmak istemiyorsa,
bunun yerine 404 (Bulunamadı) durum kodu kullanılabilir.


4
Doğal olarak bunu kimlik doğrulaması veya izin tabanlı hatalarla ilişkilendirmeme rağmen başlangıçta iyi görünüyor. Ayrıca, spesifikasyon "sunucu bu bilgiyi istemciye sunmak istemiyorsa" der. Ayrıca 404 daha iyi bir seçenek olabilir.
403'ten

21
Bu, teknik açıdan sağlam olsa bile korkunç bir fikirdir. 403 evrensel olarak kimlik doğrulama hatası yanıtları için kullanılır ve parametre hatalarını belirtmek için bunu kullanmaya çalışırsanız istemcilerinizin kafasını karıştıracaksınız. Örneğin Twitter bunu yapar - 403 hem geçersiz OAuth kimlik bilgileri sağladığınızda hem de isteğinizde anlamsal olarak yanlış bir şey olduğunda kullanılır ve API istemcileri için sürekli bir karışıklık kaynağıdır.
Matt Zukowski

1
@MattZukowski iyi, bu sadece yanlış. Teknik özellik Authorization will not help, Twitter'ın geçersiz OAuth kimlik bilgileri için bunu göndermemesi gerektiğini söylüyor .
torvin

@torvin Twitter 401 Unauthorizedbunun yerine gönderiyor olmalı . Bununla birlikte, MDN belgelerinin bu iki kodla ilgili açıklamalarına bakarsanız, neden benzer olduklarını anlayabilirsiniz .
Agi Hammerthief

-1

ASP.NET Core'u bir referans veya örnek olarak kullanmak için ASP.NET Core, bir denetleyiciyi eylemlerle oluşturmanıza izin verir, "Ayrıntılar" eylemi bu şekilde görünür.

    // 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);
    }

Parametre idayarlanmamışsa, 404 Bulunamadı değerini döndürür.


-5

Bir 404 döndürün - bu, kaynağın bulunamadığı anlamına gelir.

Kimlik içeren bir sitenin URL'sini düzenlemeyi deneyin. Birkaçını denedim:

  • gitub repo sorunu
  • izdiham sayfası
  • amazon ürün görünümü
  • ebay listeleme
  • bbc haber makalesi

Tüm dönüşler 404, imo çünkü bu geliştiriciler standardı doğru yorumluyorlar, burada ve diğerlerinin cevabı değil!


1
Çoğu devs "parametre" bir sorgu dizesi veya form POST gövdesinde ad / değer çiftlerinden biri olarak tanımlamak inanıyoruz. Bir Github repo sorunu isteği bunu içermiyor.
Kelvin

@Kelvin we devs ayrıca yol parametrelerini listeye ekler. HERHANGİ bir url parametresi zorunluysa, bir kaynağın konumunu temsil eder ve dahil edilmezse, 404 döndürülmelidir. Bu hariçtir requestBody.
jenson-button-event

-6

403 ile giderdim.

Gönderen RFC 2616 - Köprü Metni Aktarım Protokolü - HTTP / 1.1

403 yasak

Sunucu isteği anladı, ancak yerine getirmeyi reddediyor. Yetkilendirme yardımcı olmaz ve istek tekrarlanmamalıdır. İstek yöntemi HEAD değilse ve sunucu, isteğin neden yerine getirilmediğini halka duyurmak istiyorsa, kuruluştaki ret nedenini açıklamalıdır. Sunucu bu bilgileri istemcinin kullanımına açmak istemiyorsa, bunun yerine 404 (Bulunamadı) durum kodu kullanılabilir.

Yanıtınızdaki başarısızlığın nedenini açıklamalısınız. Bunu yapmamayı tercih ederseniz, sadece 404 kullanın.


3
Bu yinelenen bir yanıt olduğu için indirildi. En son
kullanıcı
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.