По сути, он как GET, но при этом у него есть body, как у POST-запроса.
Отвечая на логичный вопрос: «А нахуя он вообще нужен?» — я отвечу.
Он нужен для тех ситуаций, когда мы ничего не меняем на сервисе, на сервере, но при этом создаём какой-то сложный поисковый запрос с большим набором фильтров.
В целом, когда мы хотим получить какие-то данные, мы отправляем GET-запрос. Но есть проблема: у него нет тела запроса, и, соответственно, все данные передаются в URL.
Если фильтров много или они сложные, много условий, какие-то вложенные JSON, пагинация, сортировка и так далее, URL становится огромным, нечитаемым и может упереться в лимиты.
Либо он попадает в логи, историю браузера, и, если в фильтрах есть какие-то чувствительные данные, это, соответственно, плохо.
Что же используют вместо GET-запроса?
В таком случае используют POST-запрос. Просто в body складывают все необходимые фильтры. На этом, собственно, всё.
Несмотря на то, что POST в RESTful — это про изменение данных, он использовался как раз-таки для таких запросов.
И наш новый метод, по сути, решает именно эту проблему.
При этом он уже стандартизирован, но на самом деле пока что какого-то массового использования у него нет, потому что он опубликован буквально в прошлом месяце. Сейчас в основном встречаются всякие тестовые реализации.
Я хотел найти и показать вам, как он используется, но мы позже об этом проговорим.
Нам нужно понимать, что GET у нас безопасный и идемпотентный запрос, но параметры у него обычно передаются в URL.
POST может передать нам сложное тело, но это не обязательно безопасная или идемпотентная операция.
А QUERY — это безопасный и идемпотентный запрос с полноценным телом.
Сейчас какой-то реальной поддержки этого запроса нет. Я думаю, что в ближайшем будущем будет. Я здесь солидарен с Валентином Кимом.
Но давайте посмотрим, как он может выглядеть в Chrome прямо через DevTools, и заодно посмотрим на POST-запрос, который используется в таких случаях, когда нам это нужно.
- Открой любой сайт.
- Нажми F12.
- Перейди в Console.
- Выполни:
fetch("https://httpbin.org/anything", {
method: "QUERY",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
filters: {
status: "ACTIVE"
},
page: 0,
size: 20
})
})
.then(response => response.json())
.then(console.log)
.catch(console.error);- После этого открой Network, найди
anything и посмотри:Request Method: QUERY
Возможен нюанс: из-за CORS сначала появится запрос OPTIONS, а сам QUERY может быть заблокирован сервером. Это как раз одна из текущих проблем нового метода.
А для POST-запроса с большим количеством фильтров и сортировкой можно сделать следующее:
- Открой:
https://fontawesome.com/search- Открой DevTools → Network.
- Включи фильтр Fetch/XHR.
- В строке поиска введи, например,
user.- Выбери несколько фильтров: стиль, категорию, бесплатные или платные и так далее.
- Найди запрос, в адресе которого есть:
algolianet.com/1/indexes/*/queries
У него должен быть:
Request Method: POSTПри этом запрос только ищет и возвращает иконки. Он не создаёт новую сущность.
Думаю астрологи объявят совсем скоро неделю вопросов про новый запрос, этакая проверка слежки за новостями
прочесть про сам метод: https://www.rfc-editor.org/rfc/rfc10008.html
