elasticsearch Elasticsearch使用请求正文获取请求,elasticsearch,curl,post,get,elasticsearch,Curl,Post,Get" /> elasticsearch Elasticsearch使用请求正文获取请求,elasticsearch,curl,post,get,elasticsearch,Curl,Post,Get" />

elasticsearch Elasticsearch使用请求正文获取请求

elasticsearch Elasticsearch使用请求正文获取请求,elasticsearch,curl,post,get,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请求中的请求体

将请求主体和GET请求一起传递不是违反REST风格的方法吗

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

curl localhost:9200/megacorp/employee/_search -d '{"query" : {"filtered" : {"filter" : {"range" : {"age" : { "gt" : 30 }}},"query" : {"match" : {"last_name" : "smith"}}}}}'
有些工具甚至是为了避免GET请求中的请求体而设计的(比如postman)

不,事实并非如此

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

GET
在这里非常适用

例如,使用以下各项运行搜索有什么区别:

GET /_search?q=foo
vs

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

这就是为什么我认为无论您是在URI内传递查询还是使用主体,
GET
在这里都是完全适用的

尽管如此,我们知道有些语言和工具不允许这样做。尽管RFC没有提到你不能有一个带有
GET
的body

因此elasticsearch也支持
POST

这:

将以相同的方式工作。

来自:

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

换句话说,这不是禁止的,但这是未定义的行为,应该避免。HTTP客户端、服务器和代理可以自由删除主体,这不会违反标准。这绝对是个坏习惯

HTTPBis工作组(HTTP和相关标准工作组)的进一步文本:

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


您可以在elasticsearch get请求中使用查询参数 只需添加source=query\u string\u body&source\u content\u type='application/json'

url将如下所示

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

看看这个可能有用的答案:关于GET和Body的详细答案-@yurko您对更改您接受的答案有何感受?我担心被接受的答案将来会误导开发人员做错误的事情。如果你声称用body发送get请求是RESTful的,那么你如何解释?-1这就是为什么所有这些解释都很混乱的原因。如果忽略语义,为什么需要这么多请求类型。RESTful API不应在其GET端点中考虑主体。Elastic stack还不成熟,有很多工作要做(就像大多数新的开源项目一样,这没什么错,是时候让它变得更好了)。如果GET中没有主体,则不需要端点后替代方案。。。这就是为什么这里很混乱,没有惯例。实际上,我支持在url中留下路径来决定,但REST的设计目的是使用HTTP semantiOne HTTP请求类型来管理它们,我认为这是最好的方式和最灵活的方式,并为通过url实现和使用协议的人留下灵活性。通过这种方式,某些端点(它们到底在做什么)将不会变得模糊。我不太喜欢休息。我是一个简单、灵活的粉丝,喜欢那些一眼就能理解的东西。这个答案绝对是错误的。有关源代码,请参见我的答案。除了Window.fetch不允许GET请求包含bodyIs GET\u search?q=foo正确吗?对那么,当您希望将foo作为json体传递时,为什么要更改语义呢?这是一个搜索电话在最后都。我没有向服务器发布任何更改其状态的内容。我只是从服务器请求一些东西,不管我以何种方式传递参数。@dadoonet,因为带有GET的实体的外观虽然不是“无效”的,但对请求来说不应该有语义意义。换句话说,它应该被忽略。无论你是否同意这一点,这绝对是协议的目的。我可以详细说明为什么我认为这实际上是一个好的设计,但我认为为了讨论这个问题,最好还是坚持原始事实。HTTP工作组明确表示,通用HTTP软件将忽略或拒绝实体。因此,elasticsearch的实现依赖于非标准行为。任何兼容的HTTP代理和缓存都会与elasticache一起出现错误行为,因为它们往往是兼容的。
curl -XPOST localhost:9200/megacorp/employee/_search -d '{"query" : {"filtered" : {"filter" : {"range" : {"age" : { "gt" : 30 }}},"query" : {"match" : {"last_name" : "smith"}}}}}'
http://localhost:9200/index/_search/?source_content_type=application/json&source={"query":{"match_all":{}}}