Я разрабатываю API, и мне интересно, можно ли отправлять полезную нагрузку JSON по запросу GET?
В этом другом вопросе Полезные нагрузки методов HTTP-запросов мы можем найти в соответствии с эту ссылку:
- HEAD - не определена семантика тела.
- GET - не определена семантика тела.
- PUT - поддерживается тело.
- POST - поддерживается тело.
- DELETE - не определена семантика тела.
- TRACE - Тело не поддерживается.
- ОПЦИИ - Поддерживается тело, но нет семантики (возможно, в будущем).
Означает ли это, что я не должен отправлять запрос GET с полезной нагрузкой? Существуют ли риски для этого?
- Как у некоторых HTTP-клиентских библиотек, неспособных отправить такую полезную нагрузку?
- Или мой код Java API не переносится на некоторых серверах приложений?
- Что-нибудь еще?
Я узнал, что ElasticSearch использовал такую полезную нагрузку в запросе GET:
$ curl -XGET 'http://localhost:9200/twitter/tweet/_search?routing=kimchy' -d '{
"query": {
"filtered" : {
"query" : {
"query_string" : {
"query" : "some query string here"
}
},
"filter" : {
"term" : { "user" : "kimchy" }
}
}
}
}
'
Итак, если эта популярная библиотека делает это, и никто не жалуется, то, возможно, я могу сделать то же самое?
Кстати, Я хотел бы знать, если это нормально, чтобы смешивать параметры queryString и полезную нагрузку JSON? Точно так же, как это делает запрос ElasticSearch. Если да, существуют ли правила, чтобы мы знали, какие аргументы должны быть параметрами queryString или параметрами полезной нагрузки?
Здесь мы можем прочитать: HTTP GET с телом запроса
Комментарий Роя Филдинг о включении тела с запросом GET.
Да. Другими словами, любому сообщению HTTP-запроса разрешено содержать и, следовательно, должен анализировать сообщения с учетом этого. сервер однако семантика GET ограничена таким, что тело, если оно есть, не имеет семантического значения для запроса. Требования к разбору не зависят от требований по семантике метода.
Итак, да, вы можете отправить тело с GET, и нет, никогда не полезно сделайте это.
Это часть многоуровневой конструкции HTTP/1.1, которая станет понятной снова, когда спецификация разделена (выполняется работа).
.... Рой
Тогда я действительно не понимаю, почему он никогда не бывает полезен, потому что имеет смысл, на мой взгляд, отправлять сложные запросы на сервер, который не подходит для queryParam или matrixParam. Я думаю, что дизайнеры API ElasticSearch думают одинаково...
Я планирую создать API, который можно назвать следующим:
curl -XGET 'http://localhost:9000/documents/inbox?pageIndex=0&pageSize=10&sort=title'
curl -XGET 'http://localhost:9000/documents/trash?pageIndex=0&pageSize=10&sort=title'
curl -XGET 'http://localhost:9000/documents/search?pageIndex=0&pageSize=10&sort=title' -d '{
"someSearchFilter1":"filterValue1",
"someSearchFilter2":"filterValue2",
"someSearchFilterList": ["filterValue3","xxx"]
... a lot more ...
}
'
Вам кажется, что это хорошо? Основываясь на приведенных выше соображениях.