Запрос 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"}}}}}'

Будет работать так же.