При исследовании RESTful API для асинхронных операций я столкнулся со следующим шаблоном проектирования:
POST uri:longOperation
возвращает:
- HTTP 202
- Расположение: uri:pendingOperation
GET uri:pendingOperation
возвращает:
- If operation is running
- Return a progress report.
- If operation is complete
- HTTP 303
- Расположение: uri:operationResponse
GET uri:operationResponse
- Ответ асинхронной операции
Я нахожу последний шаг сомнительным. Подумайте, что произойдет, если асинхронная операция завершится с кодом ошибки, который не имеет смысла для HTTP GET
, например HTTP 409 ("Conflict")
.
- Разве
HTTP 303
не должен указывать на ответ, связанный с uri:pendingOperation, а не на uri:operationResponse? - Считается ли использование
HTTP 303
таким образом вредным? Если нет, то почему? - Это лучшее, что мы можем сделать, или есть лучший способ?