2012-12-13 16 views
8

Ben aşağıdaki tasarım deseni karşılaştım olmayan işlemler için dinlendirici API'leri araştırma yaparken: pendingOperation REST: HTTP 303 senkronize olmayan işlemler için zararlı kabul edilir mi?

GET uri:pendingOperation döner:

POST uri:longOperation döner:

  • HTTP 202
  • Yer: uri :

    • İşletim çalışıyorsa
      • Bir ilerleme raporu döndürün.
    • işlemin tamamlandığını ise
      • HTTP 303
      • Yer: uri: operationResponse

    GET uri:operationResponse

    • Asynch tepkisi ronous operation

    Son adımı sorgulanabilir buluyorum. Eşzamansız işlem, HTTP GET için HTTP 409 ("Conflict") gibi bir anlam ifade etmeyen bir hata koduyla tamamlanırsa ne olacağını düşünün. pendingOperationuri aksine: operationResponse

    1. uri ile ilişkili tepki göstermek için gerekli değildir HTTP 303 mı?
    2. HTTP 303 bu şekilde zararlı olarak kabul edilir mi? Değilse neden?
    3. Yapabileceğimiz en iyi şey bu mu, yoksa daha iyi bir yolu var mı?

cevap

6

HTTP 303 uri ile ilişkili tepki göstermek için gerekli değildir: pendingOperation uri aksine: operationResponse?

spec, bunun gerekli olduğunu açıkça söylemez, ancak sizinle aynı fikirde olma eğilimindeyim.

HTTP 303 bu şekilde zararlı olarak değerlendiriliyor mu? Değilse neden?

Ben bunu bittiğinde otomatik yönlendirme için "güzel" iken bir 303. yaparak yeteneklerini kaybederler düşünüyorum Sonuçlardan etrafında meta veri sağlamak için bir fırsat yok, böylece o, bunu yapar raporlama vb. için de kullanılabilir. Ayrıca birçok müşteri 303'ü otomatik olarak takip etmemektedir, bu nedenle müşterinin 303 Konum üstbilgisini takip etmek için çalışma yapması gerekebilir.

Yapabileceğimiz en iyisi bu mu, yoksa daha iyi bir yolu var mı?

Ben "tam" dır çıkışına bir referansla hep bir statü kaynağı ile GET uri:pendingOperation dönüşünü 200 olan tavsiye eğilimindedir.

gibi bir şey olduğunda Eksik

{ 
    "status" : "PENDING" 
} 

Hata

{ 
    "status" : "COMPLETE" 
    "errors" : [ 
     { 
      "typeId" : "OPERATION_TIMEOUT", 
      "description" : " "The request was unable to complete because the systems are unresponsive". 
     } 
    ] 
} 

Başarılı

{ 
    "status" : "COMPLETE" 
    "links" : { 
     "result" : { 
      "href" : "http://api.example.com/finished-resource/1234", 
     } 
    ] 
} 

İlgili konular