带有请求正文的ElasticSearch Get请求

eyh26e7m  于 2022-10-06  发布在  ElasticSearch
关注(0)|答案(3)|浏览(212)

将请求正文与GET请求一起传递不是违反REST风格的方法吗?

例如,过滤Elasticearch中的某些信息

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

有些工具甚至被设计成在GET请求中避免请求正文(如 Postman )

mi7gmzs6

mi7gmzs61#

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

换句话说,这并不是禁止的,但这是一种未定义的行为,应该避免。HTTP客户端、服务器和代理可以自由地丢弃正文,这不会违反标准。这绝对是一种糟糕的做法。

HTTPBis工作组(从事HTTP和相关标准工作的工作组)的进一步案文:
最后,请注意,虽然HTTP允许GET请求在语法上具有正文,但这样做只是为了允许解析器是泛型的;根据RFC7231,第4.3.1节,GET上的正文没有意义,将被通用的HTTP软件忽略或拒绝。

source

brccelvz

brccelvz2#

不是的。不是的。

在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"}}}}}'

也会以同样的方式工作。

bjp0bcyl

bjp0bcyl3#

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

URL将如下所示:

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

相关问题