Неправильно ли вернуть 202 «Принят» в ответ на HTTP GET? - PullRequest
76 голосов
/ 04 ноября 2010

У меня есть набор ресурсов, чьи представления лениво создаются. Вычисление для построения этих представлений может занять от нескольких миллисекунд до нескольких часов, в зависимости от нагрузки на сервер, конкретного ресурса и фазы луны.

Первый запрос GET, полученный для ресурса, запускает вычисления на сервере. Если вычисление завершается в течение нескольких секунд, вычисленное представление возвращается. В противном случае возвращается код состояния 202 «Принят», и клиент должен опрашивать ресурс, пока не будет доступно окончательное представление.

Причина такого поведения заключается в следующем: если результат доступен в течение нескольких секунд, его необходимо получить как можно скорее; в противном случае, когда он станет доступным, не важно.

Из-за ограниченного объема памяти и огромного объема запросов ни NIO, ни длительный опрос не являются опцией ( т.е. . Я не могу держать почти достаточно открытых соединений, и даже не могу даже удовлетворить все запросы в памяти; по прошествии нескольких секунд я сохраняю лишние запросы). Аналогично, ограничения клиента таковы, что они не могут обрабатывать обратный вызов завершения. Наконец, обратите внимание, что я не заинтересован в создании «фабричного» ресурса, к которому следует POST, так как дополнительные обходы означают, что мы терпим неудачу в кусочно-реальном ограничении в реальном времени больше, чем хотелось бы (более того, это дополнительная сложность; кроме того, это ресурс, который будет извлечь выгоду из кеширования).

Я полагаю, что существует некоторая полемика по поводу возврата кода состояния «Принятый» 202 в ответ на запрос GET, поскольку я никогда не видел его на практике, а его наиболее интуитивное использование - в ответ на небезопасные методы, но я Я никогда не находил ничего особенно обескураживающего. Кроме того, я не сохраняю безопасность и идемпотентность?

Итак, что люди думают об этом подходе?

РЕДАКТИРОВАТЬ : Я должен упомянуть, что это для так называемого бизнес-веб-API, а не для браузеров.

Ответы [ 4 ]

60 голосов
/ 04 ноября 2010

Если это для четко определенного и документированного API, 202 звучит точно прямо для того, что происходит.

Если бы это было для публичного Интернета, я бы слишком беспокоился о совместимости клиента.Я видел так много if (status == 200) жестко запрограммированных .... В этом случае я бы вернул 200.

Кроме того, RFC не указывает на то, что при использовании 202потому что запрос GET неправильный, хотя он делает четкие различия в других описаниях кода (например, 200).

Запрос принят к обработке, но обработка не завершена.

11 голосов
/ 04 ноября 2010

Мы сделали это для недавнего приложения, клиент (пользовательское приложение, а не браузер) отправил запрос, и сервер вернул 202 с URI для публикуемого «задания» - клиент использовал этот URI опрос для результата - это, кажется, хорошо вписывается в то, что было сделано.

В любом случае, самое важное - документировать, как работает ваш сервис / API, и что означает ответ 202.

9 голосов
/ 04 ноября 2010

Из того, что я могу вспомнить - GET должен возвращать ресурс без изменения сервера. Может быть, активность будет записана или что у вас есть, но запрос должен быть перезапущен с тем же результатом.

POST, с другой стороны, представляет собой запрос на изменение состояния чего-либо на сервере. Вставьте запись, удалите запись, запустите задание, что-то в этом роде. 202 подходит для POST, который вернулся, но не завершен, но на самом деле это не GET-запрос.

Все это очень пуританский и не очень хорошо практикуемый в дикой природе, так что вы, вероятно, в безопасности, возвращая 202. GET должен вернуть 200. POST может вернуть 200, если он закончил, или 202, если он не был сделан.

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

0 голосов
/ 28 ноября 2018

В случае ресурса, который должен иметь представление сущности, которая четко указывается идентификатором (в отличие от «фабричного» ресурса, как описано в вопросе), я рекомендую придерживаться метода GET ив ситуации, когда объект / представление недоступно из-за отложенного создания или любой другой временной ситуации, используйте более подходящий код ответа 503 Service Unavailable, который был фактически разработан для подобных ситуаций.

Причину этого можно найти в RFC для самого HTTP (пожалуйста, проверьте описание кода ответа 503), а также на многочисленных других ресурсах.

Пожалуйста, сравните с кодом состояния HTTP для временно недоступныхстраниц .Хотя этот вопрос касается другого варианта использования, на самом деле он относится к точно такой же функции HTTP.

...