Насколько я понял ваш вопрос, вы пытаетесь сохранить поисковый запрос и, сохранив его, также получить ответ за один раз?
Обычно GET
используется для получения состояния ресурсов, хотя, как этоМетод определен как safe
, его не следует использовать, если для вызываемого ресурса создано определенное состояние, как при сохранении поискового запроса. RFC 7231 далее заявляет, что:
Полезная нагрузка в сообщении запроса GET не имеет определенной семантики;отправка тела полезной нагрузки по запросу GET может привести к тому, что некоторые существующие реализации отклонят запрос.
Поэтому я бы воздержался от варианта № 1 или № 2, поскольку это может нарушить совместимость определенных клиентов.
POST
, с другой стороны, определяется в RFC 7231 как
Метод POST запрашивает, чтобы целевой ресурс обработал представление, заключенное в запросе, в соответствии с собственным ресурсом.специфическая семантика.
Поэтому его следует использовать в любой ситуации, когда другие HTTP-операции не подходят.Спецификация HTTP также определяет, что при создании нового ресурса должен быть возвращен код состояния 201 Created
HTTP, включая заголовок ответа HTTP с именем Location
, содержащий URI созданного ресурса.Этот URI впоследствии может быть использован для получения его состояния (т. Е. Результата выполненного поиска).
С точки зрения клиента вы в основном храните какое-либо определение запроса на сервере и не заботитесь о том, где и как на самом деле находится сервер.сохраняя это.Все, что вам нужно, - это получить дескриптор, который вы позже сможете вызвать.Это не мешает серверу возвращать текущий результат поиска в пределах полезной нагрузки ответа.И именно это я и сделаю.
Предлагаемые шаги:
- Отправить запрос на поиск через POST
- Сохранить определение запроса
- Создать URI для сохраненного запроса
- Выполнить поиск по запросу
- Вернуть ответ с кодом состояния
201 Created
и заголовком Location
, указывающим на URI сохраненного запроса, и добавить результат запроса в полезную нагрузку ответа
Клиент может позднее использовать возвращенный URI для получения текущего состояния ресурса, которое сервер может интерпретировать как: выполнить запрос, сохраненный для этого URI, и вернуть результат поиска.
КакURI должен выглядеть так, как будто он не определен архитектурой REST.Вы можете сгенерировать UUID или сгенерировать хеш-значение на основе запроса.Последний подход имеет то преимущество, что множественные идентичные запросы не приводят к созданию дополнительных запросов, а к их повторному использованию.В таких случаях следует выполнить перенаправление на существующий ресурс запроса, чтобы сообщить клиенту, что его запрос уже существует, что также учитывает фактический URI ресурса запроса как побочный эффект.