带有请求正文的Elasticsearch GET请求

yur*_*rko 17 post curl get elasticsearch

是不是将REST风格的方法与GET请求一起传递请求体?

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

curl localhost:9200/megacorp/employee/_search -d '{"query" : {"filtered" : {"filter" : {"range" : {"age" : { "gt" : 30 }}},"query" : {"match" : {"last_name" : "smith"}}}}}'
Run Code Online (Sandbox Code Playgroud)

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

dad*_*net 11

不,这不对.

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

GET 适用于此.

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

所以elasticsearch也支持GET.

这个:

GET /_search?q=foo
Run Code Online (Sandbox Code Playgroud)

将以同样的方式工作.

  • 如果您声称发送带身体的获取请求是RESTful,那么您如何解释[this](/sf/answers/68842091/)? (10认同)
  • -1这就是为什么它与所有这些解释混乱的原因.如果忽略语义,为什么需要这么多的请求类型.RESTful API不应考虑其GET端点中的主体.弹性堆栈只是hacky而不成熟,很多工作要做(就像大多数新开源项目一样,没有错,有时间让它变得更好).如果GET中没有正文,则不需要POST端点替代...这就是为什么它是混乱,没有约定.我实际上是要离开url中的路径来决定,但REST的目的是使用HTTP semanti (5认同)
  • 这个答案肯定是不正确的。请参阅我的答案以获取来源。 (5认同)

Eve*_*ert 8

来自RFC:

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

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

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

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

资源

  • 我可以详细说明为什么我认为这实际上是一个很好的设计,但我认为为了讨论的目的,最好坚持原始事实。HTTP 工作组明确指出通用 HTTP 软件将忽略或拒绝正文。因此,elasticsearch的实现依赖于非标准行为。任何兼容的 HTTP 代理和缓存在与 Elasticache 结合时都会出现错误,因为它们往往是兼容的。 (2认同)