Метод HTTP QUERY
QUERY — предлагаемый метод HTTP, закрывающий реальный пробел: он безопасный
и идемпотентный, как GET, но при этом может нести тело запроса, как POST.
Считайте его «GET, вместе с которым можно отправить полезную нагрузку».
Зачем он существует
Сложные запросы издавна вынуждали делать неудобный выбор:
GETсо строкой запроса помещает каждый фильтр в URL. У URL есть ограничения на длину, они попадают в журналы в открытом виде и неуклюжи для структурированных или вложенных условий.POSTс телом прекрасно несёт полезную нагрузку, но лжёт о намерении.POSTне является ни безопасным, ни идемпотентным, поэтому кэши, краулеры и промежуточные узлы вынуждены считать, что запрос изменяет состояние. А он не изменяет — вы просто читаете.
QUERY снимает это противоречие: семантика говорит «это чтение», а тело несёт условия выборки.
Свойства
| Свойство | QUERY | GET | POST |
|---|---|---|---|
| Безопасный | ✓ | ✓ | ✗ |
| Идемпотентный | ✓ | ✓ | ✗ |
| Тело запроса | ✓ | ✗ | ✓ |
| Кэшируемый | ✓ | ✓ | с оговорками |
Как выглядит запрос
QUERY /products HTTP/1.1
Host: shop.example
Content-Type: application/json
Accept: application/json
{ "category": "boots", "inStock": true }
Кэширование с помощью Content-Location
Поскольку QUERY безопасен и идемпотентен, ответ можно кэшировать — но ключом
кэша не может быть один лишь URL, ведь тело меняется. Сервер указывает
каноническое расположение результата заголовком Content-Location:
HTTP/1.1 200 OK
Content-Location: /products?category=boots&inStock=true
Cache-Control: max-age=60
Кэш (или клиент) затем может переиспользовать это представление для эквивалентного запроса. Именно этот механизм позволяет чтению с телом оставаться кэшируемым.
Попробуйте сами
Загляните в Песочницу и отправьте настоящий запрос QUERY на эхо-эндпоинт
этого сайта, чтобы в точности увидеть, как метод, заголовки и тело доходят
до сервера.
QUERY определён в IETF Internet-Draft и всё ещё развивается. Считайте приведённые выше подробности рабочей выжимкой и сверяйтесь со связанным черновиком как с авторитетным и актуальным текстом.