REST: Wird HTTP 303 als schädlich für asynchrone Operationen betrachtet?

8

Bei der Untersuchung von RESTful-APIs für asynchrone Vorgänge habe ich das folgende Entwurfsmuster durchlaufen:

POST uri:longOperation gibt zurück:

  • HTTP 202
  • Ort: uri: pendingOperation

GET uri:pendingOperation gibt zurück:

  • Wenn der Vorgang ausgeführt wird
    • Einen Fortschrittsbericht zurückgeben.
  • Wenn die Operation abgeschlossen ist
    • HTTP 303
    • Ort: uri: operationResponse

GET uri:operationResponse

  • Die Antwort der asynchronen Operation

Ich finde den letzten Schritt fraglich. Überlegen Sie, was passiert, wenn der asynchrone Vorgang mit einem Fehlercode abgeschlossen wird, der für HTTP GET nicht sinnvoll ist, z. B. HTTP 409 ("Conflict") .

  1. Ist nicht HTTP 303 erforderlich, um auf die Antwort zu verweisen, die mit uri: pendingOperation im Gegensatz zu uri: operationResponse verknüpft ist?
  2. Verwendet HTTP 303 auf diese Weise als schädlich? Wenn nicht, warum?
  3. Ist das das Beste, was wir tun können, oder gibt es einen besseren Weg?
Gili 13.12.2012, 19:37
quelle

1 Antwort

6
  

Ist HTTP 303 nicht erforderlich, um auf die mit uri: pendingOperation verbundene Antwort im Gegensatz zu uri: operationResponse zu zeigen?

Die Spezifikation sagt nicht explizit, dass es erforderlich ist, aber ich tendieren dazu, dir zuzustimmen.

  

Wird HTTP 303 auf diese Weise als schädlich angesehen? Wenn nicht, warum?

Ich denke, Sie verlieren Fähigkeiten, indem Sie eine 303 ausführen. Obwohl es "schön" ist, automatisch umzuleiten, wenn Sie fertig sind, ist es so, dass Sie keine Gelegenheit haben, Metadaten rund um die Ergebnisse bereitzustellen, die genutzt werden können für die Berichterstellung usw. ... Auch folgen viele Clients nicht automatisch 303, so dass der Client möglicherweise Arbeiten ausführen muss, um dem 303-Standort-Header trotzdem zu folgen.

  

Ist das das Beste, was wir tun können, oder gibt es einen besseren Weg?

Ich empfehle tendenziell, dass GET uri:pendingOperation 200 mit einer Statusressource immer mit einem Verweis auf die Ausgabe zurückgibt, wenn sie "abgeschlossen" ist. Etwas wie

Wenn unvollständig

%Vor%

Wenn Fehler

%Vor%

Wenn erfolgreich

%Vor%
  

    
Daniel Roop 02.02.2013 23:27
quelle

Tags und Links