对于将请求正文与GET请求一起传递,是不是采用REST风格的方法?
例如,在Elasticsearch中过滤一些信息
curl localhost:9200/megacorp/employee/_search -d '{"query" : {"filtered" : {"filter" : {"range" : {"age" : { "gt" : 30 }}},"query" : {"match" : {"last_name" : "smith"}}}}}'
甚至设计了一些工具来避免GET请求中的请求体(如邮递员)
答案 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软件忽略或拒绝。
答案 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