elasticsearch curl如何使用数据负载执行get请求?,elasticsearch,curl,get,elasticsearch,Curl,Get" /> elasticsearch curl如何使用数据负载执行get请求?,elasticsearch,curl,get,elasticsearch,Curl,Get" />

elasticsearch curl如何使用数据负载执行get请求?

elasticsearch curl如何使用数据负载执行get请求?,elasticsearch,curl,get,elasticsearch,Curl,Get,ElasticSearch的介绍材料包括以下示例curlrequest: curl -X GET "localhost:9200/_search?pretty" -H 'Content-Type: application/json' -d' { "query": { "query_string" : { "query" : "(new york city) OR (big apple)", "default_field" :

ElasticSearch的介绍材料包括以下示例
curl
request:

curl -X GET "localhost:9200/_search?pretty" -H 'Content-Type: application/json' -d'
{
    "query": {
        "query_string" : {
            "query" : "(new york city) OR (big apple)",
            "default_field" : "content"
        }
    }
}
'
此请求有两个我认为不兼容的参数:

  • -X GET
    ,指定请求为
    GET
  • -d[…]
    ,指定请求具有数据负载

我认为只有在
PUT
POST
请求中才能指定数据有效负载,因为
GET
请求没有任何数据有效负载的概念。这是有效的
curl
命令吗?它到底做什么?

上面的
curl
请求是一个有效的请求,事实上,如果您有索引和数据,那么您可以检查命令的输出

我在我的系统和ES索引中尝试了它,它给了我正确的响应

curl -v -X GET "localhost:9500/querytime/_search?pretty" -H 'Content-Type: application/json' -d'
{
    "query": {
        "query_string" : {
            "query" : "(avengers) OR (big apple)",
            "default_field" : "movie_name"
        }
    }
}'
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 9500 (#0)
> GET /querytime/_search?pretty HTTP/1.1
> Host: localhost:9500
> User-Agent: curl/7.64.1
> Accept: */*
> Content-Type: application/json
> Content-Length: 156
>
* upload completely sent off: 156 out of 156 bytes
< HTTP/1.1 200 OK
< content-type: application/json; charset=UTF-8
< content-length: 905
<
{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 0.14874382,
    "hits" : [
      {
        "_index" : "querytime",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.14874382,
        "_source" : {
          "movie_name" : "Avengers: Infinity War"
        }
      }
    ]
  }
}
curl-v-X GET“localhost:9500/querytime/_search?pretty”—H'内容类型:application/json'-d'
{
“查询”:{
“查询字符串”:{
“查询”:“(复仇者)或(大苹果)”,
“默认\u字段”:“电影\u名称”
}
}
}'
*正在尝试::1。。。
*TCP_节点集
*已连接到本地主机(::1)端口9500(#0)
>GET/querytime/_search?相当不错的HTTP/1.1
>主机:本地主机:9500
>用户代理:curl/7.64.1
>接受:*/*
>内容类型:application/json
>内容长度:156
>
*上传已完全发送:156字节中的156字节
正如curl命令的官方手册中所述,如果您使用的是基于
*nix
的系统,那么您可以在
curl
的手册中进行以下搜索

-G、 --得到 使用此选项时,将使使用-d、-data、-data binary或-data urlencode指定的所有数据在 HTTP GET请求,而不是POST请求 用过。这个 数据将用“?”分隔符附加到URL


正如SO answer中所解释的,它还取决于web服务器来解析GET请求中的正文。

我明白了,所以GET请求的正文为空是一个建议,取决于服务器的解释,而不是HTTP协议的硬性要求,服务器可以选择接受带有正文的GET请求。我仍然认为这不符合协议定义的意图,但我可以理解为什么这样做很方便。@AlekseyBilogur,我同意你的观点,但这取决于实现者,尤其是ES,你会看到很多这样的请求:-)。顺便说一句,感谢您的支持和接受,它激励我们超越自我,帮助社区