【问题标题】:Passing request_body with GET request?使用 GET 请求传递 request_body?
【发布时间】:2019-06-07 19:38:03
【问题描述】:

就像this elastic get query 我看到下面的例子,根据我的理解,query_stringGET request 的请求正文下传递。不是吗?但是我相信我们不能用 GET 请求传递请求体,那么这个例子怎么会是真的呢?

GET /_search
{
    "query": {
        "query_string" : {
            "default_field" : "content",
            "query" : "this AND that OR thus"
        }
    }
}

事实上,当我使用上述链接中的选项 COPY as CURL 时,我在下面看到复制文本

curl -X GET "localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
    "query": {
        "query_string" : {
            "default_field" : "content",
            "query" : "this AND that OR thus"
        }
    }
}
'

我在这里遗漏了什么或示例中有什么问题吗?实际上我没有看到在Postman工具下发送请求正文的方式。

【问题讨论】:

标签: elasticsearch web-applications http-post http-get


【解决方案1】:

这实际上是一个非常有趣的问题。事实上,很多 HTTP 客户端不支持带有 body 的 GET 请求(我最近遇到了,Cocoa 中的 iOS 客户端无法做到这一点)。

我也和我的同事进行了很多讨论——在我使用 Elasticsearch 很长时间之后,GET 与 body 听起来像是一个完美的 HTTP 请求,但有些人可能会争辩说,GET 根本不应该与 body 一起使用根据HTTP standard。但是,我将把这个讨论排除在这个答案之外。

通常这会导致一种情况,如果您使用不支持 GET 的客户端,您可以将其更改为 POST 或切换到其他内容 - 我曾经一直使用 cURL 或 Kibana 开发工具,如果我需要动态构建复杂的查询

【讨论】:

    【解决方案2】:

    事实上,您可以发送带有正文的GET 请求。当前的 HTTP 标准 rfc7231(已过时的 rfc2616 和更新的 rfc2817)没有严格定义带有正文的 GET 请求必须发生什么。以前的版本在这方面有所不同。出于这个原因,一些 HTTP 服务器允许它,但有些则不允许,恐怕。这种情况在最新标准中提到如下:

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

    就 Elasticsearch 而言,将GET 用于搜索请求是一项设计决策。他们觉得这在语义上更有意义。因为它比POST 动词更能代表数据检索操作。

    另一方面,如上所述,带有正文的GET 请求并不受普遍支持。这就是 Postman 不允许您这样做的原因,尽管 Kibana > Dev Tool 使用 cURL 来做到这一点。因此,Elasticsearch 搜索 API 也支持POST 请求来搜索和检索信息。因此,当您无法使用正文发出GET 请求时,您可以通过发出POST 请求获得完全相同的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-17
      • 2019-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多