Soru Geçersiz İçerik Kodlama üstbilgisini belirten istek için uygun HTTP durum kodu?


Bir istemci bir HTTP isteği gönderirse ve sunucu tarafından kodu çözülemeyen bir İçerik Kodlaması üstbilgisini belirtirse hangi durum kodu döndürülmelidir?

Örnek

Bir istemci JSON verilerini bir REST kaynağına POST yapar ve gzip kodlamasını kullanarak varlık gövdesini kodlar. Ancak, sunucu yalnızca sunucu okulundaki gzip sınıfını başarısız olduğu için DEFLATE kodlamaları çözebilir.

Hangi HTTP yanıt kodu döndürülmeli? şöyle söylerdim 415 Desteklenmeyen Medya Türü Ancak, varlığın İçerik Türü olan sorun değil - aksi halde desteklenen başka bir kuruluşun kodlamasıdır.

Hangisi daha uygun: 415? 400? Belki özel bir cevap kodu?


Zeyilname: Elbette, rfc2616'yı iyice kontrol ettim. Cevap varsa, yeni düzeltici gözlüklere ihtiyacım olabilir, ama bunun olduğuna inanmıyorum.


Güncelleştirme:

Bunun bir müşteri için kabul edilemez olabilecek bir yanıt göndermeyle ilgisi yoktur. Sorun, istemcinin sunucuyu, sunucunun anlayamadığı bir kodlamada geçerli bir ortam türü olabilecek veya olmayabilecek bir sunucu göndermesidir. Content-Encoding İstemci istek mesajıyla birlikte paketlenir).

Bu bir uç durumdur ve tarayıcı kullanıcı aracıları ile uğraşırken karşılaşılmamıştır, ancak kaynak oluşturmak / değiştirmek için varlık kurumlarını kabul eden REST API'lerinde kesinti yapabilir.


25
2017-07-12 21:32


Menşei




Cevaplar:


Ben okurken, 415 Unsupported Media Type en uygun gibi geliyor.

RFC 2616'dan:

10.4.16 415 Desteklenmeyen Medya Türü

Sunucu, isteğin varlığı, istenen yöntem için istenen kaynak tarafından desteklenmeyen bir biçimde olduğu için isteği reddetmeyi reddediyor.

Evet, metin kısmı "kodlama" yerine "medya türü" yazıyor, ancak asıl açıklama bu ayrımdan bahsetmiyor.

Yeni sıcaklık, RFC 7231, bu konuda bile açık:

6.5.13. 415 Desteklenmeyen Medya Türü

415 (Desteklenmeyen Ortam Türü) durum kodu,
  kökeni sunucusu, istek yükünü hizmet talebini karşılamayı reddediyor
  Hedef kaynağında bu yöntemle desteklenmeyen bir biçimde.
Biçim sorunu, isteğin belirtilmiş olmasından kaynaklanıyor olabilir
  İçerik Türü veya İçerik Kodlaması
ya da
  doğrudan veri.


42
2017-07-13 21:18



Bu şüphesiz doğru cevap - ve RFC2616'da: "Bir istek mesajındaki bir varlığın içerik kodlaması kaynak sunucu için kabul edilebilir değilse, sunucu 415 (Desteklenmeyen Ortam Türü) durum koduyla yanıt vermelidir." - Gareth Oakley
@ GarethOakley, belirtildiği gibi doğrudur rfc2616 # 14.11. - Miquella
@Miquella: Buna değer olan şey, RFC 2616 öldü. Çok yaşa RFC 723 [0-5]. :) - cHao


Milyoner Olmak İsteyen'in son sorusunu yapmalılar!

Tarayıcı, istemcinin sağladığı bilgiler sunucu tarafından işlenemeyen bir biçimde olduğundan sunucunun hizmet verememesine yönelik bir istekte bulundu. Bununla birlikte, bu, istemcinin sağladığı verileri desteklememesi için sunucunun hatası değildir, sunucunun Acccept- * başlıklarını dinlememek ve uygun olmayan bir kodlamada veri sağlamak istemcinin hatasıdır. Bu bir Müşteri Hatası (400 serisi hata kodu) yapar.

  • İlk içgüdüm 400 Kötü İstek bu durumda uygun yanıttır.
  • 405 Yöntemine İzin Verilmiyor, çünkü HTTP fiiline izin verilmeyen bir bağlantıyı ifade eder.
  • 406 Kabul Edilemez, söz verilmiş gibi görünebilir, ancak sunucunun, istemiş olduğu Accept- * istek başlıklarını karşılayan müşteriye veri sağlayamaması anlamına gelir. Bu senin davanına uygun gibi görünmüyor.
  • 412 Önkoşul Başarısız oldukça belirsiz tanımlanmıştır. Uygun olabilir, ama buna bahis oynamam.
  • 415 Desteklenmeyen Medya Türü doğru değil çünkü reddedilen veri türü değil, kodlama formatı.

Bundan sonra standart olmayan cevap kodlarının alanına gireriz.

  • 422 İşlenemez Varlık, talep iyi oluşturulmuşsa, ancak bir şekilde anlamsal olarak hatalıysa iade edilmesi gereken bir cevabı açıklar. Bu iyi bir uyum gibi görünüyor, ancak standart değil, HTTP için bir WebDAV uzantısı.

Yukarıdakiler göz önüne alındığında, biz 400 Bad Request'u tercih ediyorum. Başka bir HTTP uzmanı daha iyi bir aday olsa da, onları dinlerdim. ;)

GÜNCELLEŞTİRME: Daha önce HTTP durumlarını Wikipedia'daki sayfalarına göndermekteydim. Buradaki bilgiler doğru gibi görünse de, aynı zamanda daha azdır. Gelen özelliklerine bakarak W3C HTTP 406 hakkında çok daha fazla bilgi verir ve 406'nın doğru kod olabileceğini düşünmeme sebep olur.

10.4.7 406 Kabul Edilemez

İstek tarafından belirlenen kaynak yalnızca üretme kapasitesine sahiptir   İçerik özellikleri kabul edilemeyen yanıt varlıkları   istekte gönderilen kabul başlıklarına göre.

Bir HEAD isteği olmadığı sürece, yanıt bir varlığı içermelidir   Mevcut varlık özelliklerinin ve konumlarının listesini içeren   Kullanıcı veya kullanıcı aracısı en uygun olanı seçebilir.   Varlık biçimi, verilen ortam türüyle belirtilir.   İçerik Türü başlık alanı. Biçime ve   Kullanıcı aracısının yetenekleri, en uygun seçim   seçim otomatik olarak gerçekleştirilebilir. Ancak, bu şartname   bu tür otomatik seçim için herhangi bir standart tanımlamaz.

  Note: HTTP/1.1 servers are allowed to return responses which are
  not acceptable according to the accept headers sent in the
  request. In some cases, this may even be preferable to sending a
  406 response. User agents are encouraged to inspect the headers of
  an incoming response to determine if it is acceptable.

Yanıt kabul edilemezse, bir kullanıcı aracı geçici olarak OLMALIDIR   Daha fazla veriyi almayı durdurmak ve kullanıcıyı daha fazla bir karar için sorgulamak   eylemler.

Content-Type üstbilgisinden açıkça bahsedilirken, ifadede DEFLATE sıkıştırmasına karşı GZIP gibi materyalleri okuyabileceğiniz "varlık özellikleri" den bahseder.

Dikkate değer bir şey, spesifikasyonların, verilerin hangi formatta olduğunu ve kodlamanın hangi şekillerde kullanıldığını anlatmak için başlıklar ile birlikte gönderilmesinin uygun olabileceğini ve yalnızca müşterinin ayrılması için bırakılmasının uygun olacağını söylemektedir. . Bu nedenle istemci, GZIP sıkıştırmasını kabul ettiğini belirten bir başlık gönderirse, ancak sunucu yalnızca DEFLATE ile bir yanıt oluşturabilir, ardından bunu DEFLATE olması gerektiğini söyleyen başlıklarla birlikte göndermelidir (içeriğe bağlı olarak).

  • Müşteri: Bana bir GZIPPED sayfası verin.
  • Sunucu: Üzgünüm, hayır yapamaz. Senin için DEFLATE DEFLATE olabilir. İşte DEFLATE dolu sayfa. Senin için uygun mu?
  • Müşteri: Welllll ... Ben gerçekten DEFLATE istemedim, ama bunu çözebilirim, böylece onu alacağım.

(veya)

  • Müşteri: Bunu kullanıcımla temizlemek zorunda kalacağım. Tut.

11
2017-07-12 21:57



405, 406, 412 ve 415 hakkında haklısınız (412'nin koşullu başlık alanlarına uygulanacak şekilde açıkça tanımlandığını unutmayın). 422 olduğu Standart bir yanıt kodu (aksi takdirde kayıt defterinde olmaz), ancak aynı zamanda geçerli değildir. Yani 400 (muhtemelen yükte tanılama ile) yapmalıdır. - Julian Reschke
İyi, 400 Hatalı İstek isteğin sözdizimi hataları için olması gerekiyordu, genel bir istek hatası değil (veya en azından tanımı okudum). - ircmaxell
@ircmaxell Doğrudur. Ancak, diğer kodların hiçbiri gerçekten uymuyor ve bir şeyler göndermelisin ... - GordonM
Aslında ... W3C'deki özelliklerin okunması, 406'nın hepsinden sonra doğru cevap olabileceğini gösteren bazı ilginç müdahalelere yol açıyor. Ya da sadece verileri göndermekteyim (HTTP durum kodlarındaki önceki kaynak wikipedia idi). Cevabımı şimdi güncelliyorum. - GordonM
406 ile ilgili sorun, sunucunun yapamayacağıdır. cevap vermek o müşteri kabul etmeye istekli. Temelde OP'nin sorduğu sorunun tam tersi; Bu durumda, sunucu istemciye ne verileceğini bulmak için isteği çözemez. Konuşma, "İşte bir GZIPped isteği." Diyen istemciye daha çok benziyordu ve soru, sunucunun "WTF? Ben bununla bir şey yapamam" demesi gerektiğini söyleyen doğru yoldur (ve ideal olarak " Sadece DEFLATE, lütfen "). - cHao