带有请求正文的Elasticsearch GET请求

时间:2016-04-29 13:33:06

标签: elasticsearch curl post get

对于将请求正文与GET请求一起传递,是不是采用REST风格的方法?

例如,在Elasticsearch中过滤一些信息

curl localhost:9200/megacorp/employee/_search -d '{"query" : {"filtered" : {"filter" : {"range" : {"age" : { "gt" : 30 }}},"query" : {"match" : {"last_name" : "smith"}}}}}'

甚至设计了一些工具来避免GET请求中的请求体(如邮递员)

3 个答案:

答案 0 :(得分:10)

没有。不是。

在REST中,使用POST进行查询没有意义。 POST应该修改服务器。搜索时你显然不会修改服务器。

GET非常适用于此。

例如,使用以下命令运行搜索会有什么不同:

GET /_search?q=foo

VS

GET /_search
{
  "query": {
    "query_string": {
      "query" : "foo"
    }
  }
}

在这两种情况下,您都希望“获取”一些结果。您并不是要更改服务器端的任何状态。

这就是为什么我认为GET完全适用于您在URI中传递查询或使用正文。

话虽如此,我们知道某些语言和工具不允许这样做。虽然RFC没有提到你不能拥有GET的主体。

因此,elasticsearch也支持POST

此:

curl -XPOST localhost:9200/megacorp/employee/_search -d '{"query" : {"filtered" : {"filter" : {"range" : {"age" : { "gt" : 30 }}},"query" : {"match" : {"last_name" : "smith"}}}}}'

将以同样的方式工作。

答案 1 :(得分:7)

来自RFC

  

GET请求消息中的有效负载没有定义的语义;在GET请求上发送有效负载主体可能会导致某些现有实现拒绝该请求。

换句话说,它不是被禁止的,但它是未定义的行为,应该避免。 HTTP客户端,服务器和代理可以自由放弃身体,这不会违反标准。这绝对是一种不好的做法。

来自HTTPBis工作组(处理HTTP和相关标准的小组)的更多文本:

  

最后,请注意,虽然HTTP允许GET请求在语法上具有正文,但这只是为了允许解析器是通用的;根据RFC7231,第4.3.1节,GET上的主体没有任何意义,将被通用HTTP软件忽略或拒绝。

source

答案 2 :(得分:0)

您可以在elasticsearch获取请求中使用查询参数 只需添加source = query_string_body&source_content_type ='application / json'

该网址将如下

http://localhost:9200/index/_search/?source_content_type=application/json&source={"query":{"match_all":{}}}

参考: https://discuss.elastic.co/t/query-elasticsearch-from-browser-webservice/129697