Передача request_body с GET запросом? - PullRequest
0 голосов
/ 13 января 2019

Как и в этот эластичный запрос get Я вижу ниже пример, где согласно моему пониманию query_string передается под телом запроса в GET запросе. Не так ли? Но я считаю, что мы не можем передать тело запроса с запросом GET, тогда почему этот пример верен?

GET /_search
{
    "query": {
        "query_string" : {
            "default_field" : "content",
            "query" : "this AND that OR thus"
        }
    }
}

На самом деле, когда я использовал опцию COPY as CURL по указанной ссылке, я вижу ниже скопированный текст

curl -X GET "localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
    "query": {
        "query_string" : {
            "default_field" : "content",
            "query" : "this AND that OR thus"
        }
    }
}
'

Я что-то здесь упускаю или что-то не так в примере? На самом деле я не вижу способа отправить тело запроса в Postman tool.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Дело в том, что вы можете отправить GET запрос с телом. Текущий стандарт HTTP rfc7231 (устаревшие rfc2616 и обновления rfc2817 ) не определяет строго, что должно произойти с запросом GET с телом. Предыдущие версии были другими в этом отношении. По этой причине некоторые HTTP-серверы позволяют это, а некоторые другие, боюсь, нет. Этот случай упоминается в последнем стандарте следующим образом:

Полезная нагрузка в сообщении запроса GET не имеет определенной семантики; отправка тела полезной нагрузки по запросу GET может вызвать некоторые существующие реализации, чтобы отклонить запрос.

С точки зрения Elasticsearch, использование GET для поискового запроса является дизайнерским решением. Они чувствуют, что это имеет смысл с точки зрения семантики. Потому что он представляет действие извлечения данных лучше, чем глагол POST.

С другой стороны, как упоминалось выше, запрос GET с телом не поддерживается повсеместно. Вот почему Postman не позволяет вам этого делать, хотя Kibana> Dev Tool делает это с помощью cURL. Поэтому API поиска Elasticsearch также поддерживает POST запросов для поиска и извлечения информации. Таким образом, если вы не можете сделать запрос GET с телом, вы можете получить точно такой же результат, сделав запрос POST.

0 голосов
/ 14 января 2019

Это на самом деле очень интересный вопрос. На самом деле, многие HTTP-клиенты не поддерживают GET-запросы с телом (я только недавно столкнулся с тем, что iOS-клиент в Какао не может этого сделать).

У меня также было много дискуссий с моими коллегами - для меня после долгого использования Elasticsearch GET с телом звучит как отличный HTTP-запрос, однако некоторые могут утверждать, что GET вообще не должен идти с телом согласно стандарту HTTP . Однако я оставлю это обсуждение вне этого ответа.

В целом, это приводит к ситуации, когда вы используете клиент, который не поддерживает GET, вы можете либо изменить его на POST, либо переключиться на что-то другое - я всегда использовал cURL или Kibana Dev Tools, если я необходимо построить сложный запрос на лету

...