就像this elastic get query一样,我看到以下示例,根据我的理解,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
工具发送请求正文的方法。
答案 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
请求获得完全相同的结果。