通过GET请求传递request_body吗?

时间:2019-01-13 16:40:33

标签: elasticsearch web-applications http-post http-get

就像this elastic get query一样,我看到以下示例,根据我的理解,query_stringGET请求的请求正文下传递。是不是?但是我相信我们不能将请求正文与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工具发送请求正文的方法。

2 个答案:

答案 0 :(得分:0)

这实际上是非常有趣的问题。实际上,许多HTTP客户端不支持带有正文的GET请求(我最近才发现,可可中的iOS客户端无法这样做)。

我还与同事进行了很多讨论-在长时间使用Elasticsearch之后,对于带有主体的GET来说听起来像是一个非常好的HTTP请求,但是有些人可能会认为GET根本不应该与主体一起使用根据{{​​3}}。但是,我将把这个讨论排除在这个答案之外。

通常会导致一种情况,如果您使用的客户端不支持GET,则可以将其更改为POST或切换到其他内容-我一直都使用cURL或Kibana Dev Tools需要动态构建复杂的查询

答案 1 :(得分:0)

事实是您可以发送带有正文的GET请求。当前的HTTP标准rfc7231(过时的rfc2616和更新的rfc2817)并未严格定义对带有正文的GET请求必须执行的操作。在这方面,以前的版本有所不同。因此,恐怕有些HTTP服务器允许它,但另一些HTTP服务器却不允许。最新标准中提到了这种情况,如下所示:

  

GET请求消息中的有效负载没有定义的语义;   在GET请求上发送有效内容正文可能会导致一些现有内容   拒绝请求的实现。

就Elasticsearch而言,将GET用于搜索请求是一项设计决策。他们觉得从语义上讲更有意义。因为它比POST动词更好地表示数据检索动作。

另一方面,如上所述,带有正文的GET请求不受普遍支持。这就是为什么Postman不允许您这样做,尽管Kibana> Dev Tool通过使用cURL做到了。因此,Elasticsearch搜索API还支持POST请求以搜索和检索信息。因此,当您无法通过正文提出GET请求时,可以通过发出POST请求获得完全相同的结果。