HTTP GET'e yanıt olarak 202 "Kabul Edildi" sonucunu döndürmek yanlış mı?


90

Temsilleri tembel olarak yaratılan bir dizi kaynağım var. Bu temsilleri oluşturmaya yönelik hesaplama, sunucu yüküne, belirli kaynağa ve ayın evresine bağlı olarak birkaç milisaniyeden birkaç saate kadar sürebilir.

Kaynak için alınan ilk GET isteği, sunucuda hesaplamayı başlatır. Hesaplama birkaç saniye içinde tamamlanırsa, hesaplanan gösterim döndürülür. Aksi takdirde, 202 "Kabul Edildi" durum kodu döndürülür ve istemcinin, nihai gösterim sağlanana kadar kaynağı yoklaması gerekir.

Bu davranışın nedeni şudur: Bir sonuç birkaç saniye içinde mevcutsa, mümkün olan en kısa sürede geri alınması gerekir; aksi takdirde, ne zaman kullanılabilir olduğu önemli değildir.

Sınırlı bellek ve çok büyük istek hacmi nedeniyle, ne NIO ne de uzun yoklama bir seçenek değildir ( yani , neredeyse yeterince bağlantıyı açık tutamıyorum, hatta tüm istekleri belleğe sığdıramıyorum; bir kez "birkaç saniye" geçti, fazla istekleri sürdürüyorum). Benzer şekilde, müşteri sınırlamaları, bunun yerine bir tamamlama geri aramasını işleyemeyecek şekildedir. Son olarak, bir POST'un göndereceği bir "fabrika" kaynağı oluşturmakla ilgilenmediğimi unutmayın, çünkü fazladan gidiş-dönüşler parça parça gerçek zamanlı kısıtlamada istenenden daha fazla başarısız olduğumuz anlamına gelir (dahası, bu ekstra karmaşıklıktır; ayrıca bu, önbelleğe alma işleminden yararlanın).

Bir GET isteğine yanıt olarak 202 "Kabul Edildi" durum kodunu döndürme konusunda bazı tartışmalar olduğunu düşünüyorum, bunu pratikte hiç görmediğim ve en sezgisel kullanımı güvenli olmayan yöntemlere yanıt olarak görüyorum, ancak ben asla özellikle cesaretini kıran bir şey buldum. Dahası, hem güvenliği hem de idempotensi korumuyor muyum?

Peki, insanlar bu yaklaşım hakkında ne düşünüyor?

DÜZENLEME : Bunun sözde iş web API'si için olduğunu söylemeliyim - tarayıcılar için değil.


2
Şahsen bunun iyi olduğunu düşünüyorum, tam olarak a'nın tanımı 202. Pratikte nadiren kullanıldığı için IMHO daha fazladır çünkü çok az web geliştiricisi tarayıcı / kullanıcı-aracı etkileşimine daha alışkın olduklarından uygun durum kodlarını önemsemektedir, bu durumda a 202onlara görünür bir ipucu vermez (onlara bir ipucu verin 200ve mutlu olurlar. ..).
Wrikken

1
@ user359996, sadece kullanın 200. 202o ne olduğunu gerekiyordu olmak, ama pratikte insanların beklemeyin 202.
Pacerier

pratikte kullanışlı olabilmesi için bir 200 için tahmini varış zamanı gerekiyor.
Rob

Yanıtlar:


66

İyi tanımlanmış ve belgelenmiş bir API içinse, olanlara tam olarak doğru 202geliyor .

Halka açık İnternet içinse, istemci uyumluluğu konusunda çok endişelenirim. O kadar çok if (status == 200)sabit kodlanmış gördüm ki ... Bu durumda, bir 200.

Ayrıca, RFC bir GET isteği için 202 kullanmanın yanlış olduğunu göstermezken, diğer kod açıklamalarında (örneğin 200) net ayrımlar yapar.

Talep işlenmek üzere kabul edildi, ancak işlem tamamlanmadı.


17

Bunu yeni bir uygulama için yaptık, bir istemci (özel uygulama, bir tarayıcı değil) bir sorguyu POST'ladı ve sunucu, gönderilen "işe" bir URI ile 202 döndürecekti - müşteri, bu URI'yi, sonuç - bu, yapılan şeye çok yakışmış görünüyor.

Buradaki en önemli şey, hizmetinizin / API'nizin nasıl çalıştığını ve 202 yanıtının ne anlama geldiğini belgelemektir.


+1 Yorumunuz için teşekkürler. Dokümantasyon hakkında iyi bir nokta. Ama lütfen sorumla ilgili açıklayıcı düzenlemelere dikkat edin ("fabrika" kelimesini arayın).
user359996

Peki, başlangıçta talep ettiğiniz gibi aynı URI'yi yoklamak istiyorsanız, yanıtta bu URI'yi atlayabilirsiniz. (Sadece belge bu :-) çalışması gerektiğini nasıl)
nos

İyi fikir, ancak önbelleğe almak istediğimi unutmayın, bu nedenle POST yok. Dahası, URI bir yöntemi değil kaynağı belirtir. RPC yaklaşımı yerine RESTful'u kullanıyorum (üzgünüm, başka bir belirtilmemiş kısıtlama - benim hatam).
user359996

Kesin olarak, "RESTful" ile, aslında REST kısıtlamaları tarafından belirtilenden teknik olarak biraz daha fazla olan "kaynak odaklı" demek istiyorum.
user359996

Bu aynı zamanda Subbu Allamraju tarafından yazılan " RESTful Web Services Cookbook " kitabında "1.10 Eşzamansız Görevler için POST Nasıl Kullanılır " ile desteklenmektedir
koppor

12

Hatırlayabildiğim kadarıyla - GET'in sunucuyu değiştirmeden bir kaynak döndürmesi gerekiyor. Belki faaliyet günlüğe kaydedilecek veya sizde ne var, ancak istek aynı sonuçla yeniden oluşturulabilir olmalıdır.

POST ise sunucudaki bir şeyin durumunu değiştirme isteğidir. Bir kayıt ekleyin, bir kaydı silin, bir işi çalıştırın, bunun gibi bir şey. 202, dönen ancak tamamlanmayan ancak gerçekte bir GET isteği olmayan bir POST için uygun olacaktır.

Hepsi çok püriten ve vahşi doğada pek iyi uygulanmıyor, bu yüzden 202'ye geri dönerek muhtemelen güvendesiniz. GET 200'e dönmelidir. POST, bittiyse 200, yapılmadıysa 202 döndürebilir.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html


4
Çok iyi düşündüm, ancak burada geçerli olup olmadığından emin değilim: OP'nin söylediğine göre, bu uygun bir GET isteği gibi görünüyor (çünkü sunucudaki hiçbir şeyi değiştirmiyor), sadece hesaplaması daha uzun sürüyor ve bu durum başka bir zamanda getirilecek. Belki OP yetkili bir yorumda bulunabilir. Bu bir API içindir, bu yüzden temiz bir arayüz uğruna "püriten" olmak iyidir
Pekka

Oh, pekka'ya dokun. Haklısın, GET gitmenin yolu. Ve HTTP spc'nin hazır olmayan GET'leri gerçekten hesaba kattığını sanmıyorum. Böylece her iki şekilde de gidebilirdi
Dlongnecker

7
(Şimdi alakasız) yetkili yorum: Evet, bunu idempotent olarak görüyorum. Kaynak ne ziyade 's, modifiye ne de yaratılıyor temsil henüz hesaplanmış değil.
user359996

1
Bunu nerede söylüyor? Ayrıca, 200'ü iade edersem, müşteri bir temsilin iade edilmesini beklemelidir, ancak iade edilmemiştir.
user359996

1
Geri alıyorum. 202 göründüğü gibi yalnızca GET veya POST'a karşılık gelmiyor. Protokole baktığımda içinde bulunduğum zihniyet, 202 beni yalnızca GET istekleri için var olan şey yaptı. 202, amaçlarınız için iyi olmalı.
Dlongnecker

0

Bir kimlik ile açıkça belirtilen bir varlığın temsiline sahip olması beklenen bir kaynak durumunda (soruda açıklanan "fabrika" kaynağının aksine), GET yönteminde kalmanızı ve tembel oluşturma veya başka herhangi bir geçici durum nedeniyle varlık / temsilin kullanılamadığı durumlarda, daha uygun olan ve aslında bunun gibi durumlar için tasarlanmış olan 503 Hizmet Kullanılamıyor yanıt kodunu kullanın.

Bunun gerekçesi, HTTP'nin kendisinin RFC'lerinde (lütfen 503 yanıt kodunun açıklamasını doğrulayın) ve diğer birçok kaynakta bulunabilir.

Lütfen geçici olarak kullanılamayan sayfalar için HTTP durum koduyla karşılaştırın . Bu soru farklı bir kullanım durumu ile ilgili olmasına rağmen, aslında HTTP'nin tamamen aynı özelliğiyle ilgilidir.

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.