Kısmi başarılı bir istek için HTTP durum kodu


115

Kullanıcılara mesaj gönderen bir uygulamam var. Bir gönderi talebinde, söz konusu mesajı alması gereken tüm kullanıcılardan oluşan bir XML dizisi aktarılır. Listedeki kullanıcılardan herhangi biri yoksa, daha fazla değerlendirme için eksik kullanıcıların listesini müşteriye geri veririm.

Şimdi kendime, talebin kabul edildiğini ancak yapılamayan şeyler olduğunu söyleyen başvuru için uygun durum kodunun ne olacağını soruyorum.

Eksik kullanıcıların listeye dahil edilmesine izin verilmezse sorun önlenebilirdi. Daha sonra gönderme denemesi sadece bir 4xx hatası alırdı. Ancak API'yi bu şekilde oluşturmanın bir anlamı yok. Öte yandan, hata koşulunun tamamen uygulamaya özgü olduğunu düşünebilirim. Ancak 200 göndermek doğru gelmiyor. Ve müşteriye hata yanıtına ne zaman derinlemesine bakması gerektiğine dair bir ipucu vermek güzel olurdu. örneğin bu kullanıcılara defalarca mesaj göndermekten kaçınmak için

Yanıtlar:


66

Çok benzer bir sorunla uğraştım. Bu durumda, bir

207 Çoklu Durum

Şimdi, bu katı bir HTTP değil, WebDAV uzantısının bir parçası, bu nedenle istemci üzerinde de kontrolünüz yoksa, bu sizin için iyi değil. Eğer yaparsanız, şöyle bir şey yapabilirsiniz:

   <?xml version="1.0" encoding="utf-8" ?>
   <D:multistatus xmlns:D='DAV:'>
     <D:response>
       <D:user>user-123</D:user>
       <D:status>success</D:status>
     </D:response>
     <D:response>
       <D:user>user-789</D:user>
       <D:status>failure</D:status>
     </D:response>
   </D:multistatus>

Ancak yine, bu bir HTTP uzantısıdır ve istemcinin de kontrolüne sahip olmanız gerekir.


3
Bunu kullanmayı düşündüm ama pek rahat değildim. Teşekkürler!
Norbert Hartl

Bununla ilgili güzel olan şey, istediğiniz kadar çok veya az ilgili veriyi döndürebilmenizdir - bu özellikle karışık veri kümeleri için yararlıdır, yani: bazılarının başarısız olduğu ve bazılarının geçtiği durumlarda.
Kylar

Anlıyorum. Sadece fazladan bir durum işleme seviyesinden kaçınmaya çalışıyorum (ki bu hoş bir IMHO değil). Kodumun çoğu HTTP olanlarla çalışıyor. Ve bence açıklanan kullanım durumum olmadan da iyi olacak.
Norbert Hartl

Bir gövdeyi her zaman geri gönderebilirsiniz - hangilerinin başarılı olduğunu belirlemek için bir JSON yanıtıyla veya içinde istediğiniz her şeyi içeren bir 200 gönderin.
Kylar

Evet biliyorum. Ama bir bedeni iade ederseniz, onu ayrıştırmanız gerekir. Ve o anda ikinci bir uygulama mantığı işleme katmanı tanıtıyorsunuz. Bu karmaşıklığı artırır ve o zaman bunu yapmak için iyi bir nedene ihtiyacınız vardır.
Norbert Hartl

65

Aynı sorunu yaşadım ve iki farklı çözüm kullandım:

  • 202: Acceptedİsteğin tamam olduğunu belirten HTTP dönüş kodu , ancak her şeyin olması gerektiği gibi gittiğinin garantisi yok.
  • 200Yanıtta normal bir değer döndürün , ancak yanıt gövdesine nelerin çıkmadığının bir listesini ekleyin.

İkincisi genellikle en iyi sonucu verir, ancak birincisi tembelseniz veya işlem için bir kuyruk kullanıyorsanız harikadır.


5
202 daha çok kuyruk gibi bir şeyden bahsetmiyor mu?
Sinaesthetic

6
Evet, @Sinaesthetic. En son HTTP 1.1 spesifikasyonuna göre, "(...) istek işlenmek üzere kabul edildi, ancak işlem tamamlanmadı". Kısmi başarı için 202 uygun değildir .
Huercio

-4

206 Kısmi İçerik kullanmaya ne dersiniz? 206'nın daha çok aralıklarla ilgili olduğunu biliyorum, ama ya kısmen başarılı bir istek olduğunu gösterebilirse?


MDN şunları belirtir: "HTTP 206 Kısmi İçerik başarı durumu yanıt kodu, isteğin başarılı olduğunu ve gövdenin, isteğin Aralık başlığında açıklandığı gibi istenen veri aralıklarını içerdiğini belirtir." Anladığım kadarıyla, 206 Kısmi İçerik kesinlikle bir içerik aralığına sahip istekler içindir.
sbbs

-14

Hiper Metin Aktarım Protokolü, şeylerin aktarım tarafıyla ilgilenir. Uygulama seviyesindeki hatalarla başa çıkmak için hata kodları yoktur.

200'ü iade etmek burada yapılacak doğru şeydir. HTTP ile ilgili olarak, istek doğru bir şekilde alındı, doğru şekilde işlendi ve yanıtı geri gönderiyorsunuz. Yani, HTTP seviyesinde her şey yolunda. Http'nin üzerinde çalışan uygulama ile ilgili herhangi bir hata veya uyarı yanıtın içinde olmalıdır. Bunu yapmak, proxy sunucularında karşılaşabileceğiniz ve belirli yanıtları beklediğiniz gibi işlemeyebilecek bazı kötü sorunları da önleyecektir.


18
HTTP, uygulama düzeyinde bir protokoldür. Bunu basitçe taşıma ve uygulama seviyesine koyamazsınız. OSI hakkında düşünürseniz, HTTP 5-7. Katmanlardadır. HTTP biraz farklıdır. Başlıkların ve dönüş kodlarının çoğu gerçekten uygulamaya özeldir. Kodlar, özel uygulama formatı şeylerine değil, HTTP protokol varlıklarında verilen bilgilere bağlıdır. 200 ile ilgili olarak, POST olmayan fiillere uygulanıyorsa, tanımınızın tamamen yanlış olduğunu söyleyebilirim. Ancak POST oyunu biraz değiştirir ve bu bağlamda "doğru şekilde ele alındığı" varsayımınız da kesin değildir
Norbert Hartl

Açıkça söylemek gerekirse OSI, HTTP'yi uygulama düzeyinde bir protokol olarak kabul eder ve 'normal' bir web sunucusuyla konuşurken bu doğrudur. Ancak sizin durumunuzda, bugünlerde birçok uygulamanın yaptığı gibi, HTTP'nin üzerinde kendi protokolünüzü çalıştırıyorsunuz. Bu tür bir kullanımda HTTP sadece aktarımı sağlar. (Uygulamanız kullanıcılara mesajlar gönderiyor, köprü metni
aktarmıyor

2
Açık olmak gerekirse. REST biçiminde HTTP, kaynak merkezlidir. Bu bağlamda 200, kimliğin yönünü gösteren 3xx yerine kimlik (belirttiğiniz kaynak) anlamına gelir. POST kullanmak, kaynak URI'sini bir işleme URI'sine dönüştürür ve hata kodlarının bununla başa çıkması gerekir. Bağlam biraz değişiyor ve şeylerin tanımı biraz bulanıklaşıyor veya en azından anlaşılması zorlaşıyor
Norbert Hartl

1
Bağlam kayması aynı zamanda uygun hata kodlarının olmadığı anlamına gelir, çünkü protokol asla bu bağlam göz önünde bulundurularak tasarlanmamıştır ;-) Ayrıca hata kodlarını kullanırken dikkatli olmanız gerektiğini düşünüyorum, çünkü proxy sunucuları yanıtınızı bir özel hata sayfası, bu gerçek bir PITA olabilir.
AVee

1
Neyse, sorumu cevapladığınız için teşekkürler. Stackoverflow'un kötü sohbet istemcisi olduğunu keşfettim :)
Norbert Hartl
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.