Запрос Eleticearch GET с запросом
Разве это не против подхода типа REST для передачи тела запроса вместе с запросом GET?
Например, для фильтрации некоторой информации в Elasticsearch
curl localhost:9200/megacorp/employee/_search -d '{"query" : {"filtered" : {"filter" : {"range" : {"age" : { "gt" : 30 }}},"query" : {"match" : {"last_name" : "smith"}}}}}'
некоторые инструменты даже разработаны, чтобы избежать запроса тела в запросе GET (например, почтальон)
Ответы
Ответ 1
Из RFC:
Полезная нагрузка в сообщении запроса GET не имеет определенной семантики; отправка тела полезной нагрузки по запросу GET может привести к тому, что некоторые существующие реализации отклонят запрос.
Другими словами, это не запрещено, но это неопределенное поведение и его следует избегать. HTTP-клиенты, серверы и прокси могут свободно удалять тело, и это не идет вразрез со стандартом. Это абсолютно плохая практика.
Дополнительный текст от рабочей группы HTTPBis (группа, работающая над HTTP и смежными стандартами):
Наконец, обратите внимание, что хотя HTTP позволяет GET-запросам иметь синтаксическое тело, это делается только для того, чтобы парсеры были универсальными; согласно RFC7231, раздел 4.3.1, тело в GET не имеет смысла и будет либо игнорироваться, либо отклоняться универсальным программным обеспечением HTTP.
источник
Ответ 2
Нет, это не так.
В REST использование POST
для запроса не имеет смысла. POST
должен изменить сервер. При поиске вы явно не модифицируете сервер.
GET
применяется здесь очень хорошо.
Например, какая разница в запуске поиска с помощью:
GET /_search?q=foo
против
GET /_search
{
"query": {
"query_string": {
"query" : "foo"
}
}
}
В обоих случаях вы хотели бы получить некоторые результаты. Вы не хотите менять какое-либо состояние на стороне сервера.
Вот почему я думаю, что GET
полностью применим здесь, когда вы передаете запрос в URI или используете тело.
При этом мы знаем, что некоторые языки и инструменты этого не позволяют. Хотя в RFC не упоминается, что у вас не может быть тела с GET
.
Так что эластичный поиск поддерживает также POST
.
Это:
curl -XPOST localhost:9200/megacorp/employee/_search -d '{"query" : {"filtered" : {"filter" : {"range" : {"age" : { "gt" : 30 }}},"query" : {"match" : {"last_name" : "smith"}}}}}'
Будет работать так же.