带 json 参数的 curl GET 请求
Posted
技术标签:
【中文标题】带 json 参数的 curl GET 请求【英文标题】:Curl GET request with json parameter 【发布时间】:2014-02-15 01:50:33 【问题描述】:我正在尝试通过 cURL 从命令提示符向远程 REST API 发送“GET”请求,如下所示:
curl -X GET \
-H "Content-type: application/json" \
-H "Accept: application/json" \
"http://server:5050/a/c/getName/"param0":"pradeep""
但它不返回任何输出。我尝试直接从浏览器ping URL,我能够成功获得响应,我不明白该命令有什么问题。
基本上,我想为远程 REST 服务设置一个“GET”请求,该服务通过 curl 为我提供 json 数据作为响应。谁能指导我我在做什么错误?我尝试了各种帖子,但他们都在谈论 POST 请求而不是 GET。
【问题讨论】:
您的服务器端发布了哪些错误? 没有错误,服务器端执行成功。但从 curl 方面来看,它没有显示任何数据。它只是在几秒钟后 ping,它只是显示空白,没有数据。 你可以试试 curl -i -H "Accept: application/json" "server:5050/a/c/getName"param0":"pradeep"" (选项 -i 而不是 x)。 【参考方案1】:这应该可行:
curl -i -H "Accept: application/json" 'server:5050/a/c/getName"param0":"pradeep"'
使用选项 -i 代替 x。
【讨论】:
也许报价不同? "server:5050/a/c/getName'param0':'pradeep'" 确实应该是'server:5050/a/c/getName"param0":"pradeep"'
或"server:5050/a/c/getName\"param0\":\"pradeep\""
。【参考方案2】:
如果您真的想在正文中提交带有 JSON 的 GET 请求(比如 XHR 请求,并且您知道服务器支持处理 GET 请求的正文),您可以:
curl -X GET \
-H "Content-type: application/json" \
-H "Accept: application/json" \
-d '"param0":"pradeep"' \
"http://server:5050/a/c/getName"
大多数现代网络服务器都接受这种类型的请求。
【讨论】:
这不会产生预期的结果。使用httpbin.org/get 进行调试,这会产生: "args": , "headers": "Accept": "application/json", "Content-Length": "20", "Content-Type": "application/json", "Host": "httpbin.org", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:57.0) Gecko/20100101 Firefox/57.0" , "origin": "27.94.235.50, 27.94.235.50", "url": "https://httpbin.org/get"
没有收到任何内容。您需要使用类似curl -X GET https://httpbin.org/get?data=%7B%22param0%22%3A%22pradeep%22%7D
的查询字符串
这取决于您的 Web 服务器是否正在检查 GET 请求的正文,我承认这并不完全是标准行为。像你说的那样使用 url 查询参数可能会更好。在 get 请求上使用正文的一个问题是浏览器无法通过浏览浏览器历史记录来重播请求,尽管这对于 XHR 请求可能很好。
另外,如果在服务器端有足够的控制权,可以在 json 数据中添加一个特殊属性,如“method”:“get”,在 post 请求中发送有效负载,然后让服务器上的代码将此解释为获取请求。
@Jacques 当然,但是如果您可以控制服务器,您可以轻松地让服务器读取 GET 请求的正文。回到最初的问题,我认为这整个切线有点离题。重新阅读问题,我认为 OP 无权更改服务器。
是的,这是真的。如果你控制服务器。我的评论是由您发表的以下声明引发的,就像我说的那样,它不会产生预期的结果:“大多数现代 Web 服务器都接受这种类型的请求”。实际上,他们会接受您描述的请求,但该请求将无法产生预期的结果。或者你可能想修改这样的声明:“大多数现代网络服务器都接受这种类型的请求,假设你在服务器端有直接控制权,但这是非标准的”【参考方案3】:
如果您想在正文中发送数据,则必须使用POST
或PUT
而不是GET
。
对我来说,看起来你是在尝试发送query with uri parameters,它与GET
无关,你也可以将这些参数放在POST
、PUT
等上。
查询是可选部分,由问号 (“?”) 分隔,其中包含本质上不是分层的附加标识信息。查询字符串语法没有通用定义,但它通常组织为 = 对的序列,这些对由分号或 & 号分隔。
例如:
curl http://server:5050/a/c/getName?param0=foo¶m1=bar
【讨论】:
任何 HTTP 请求消息都允许包含消息体。由于 GET 语义,它永远不会对 GET 有用 - 请求正文的内容(如果有)不应更改响应。【参考方案4】:GET 采用名称值对。
尝试类似:
curl http://server:5050/a/c/getName/?param1=pradeep
或
curl http://server:5050/a/c/getName?param1=pradeep
顺便说一句,常规 REST 应该类似于
curl http://server:5050/a/c/getName/pradeep
如果在GET URL中采用JSON,那不是标准方式。
【讨论】:
【参考方案5】:试试
curl -G ...
而不是
curl -X GET ...
通常您不需要此选项。使用专用命令行选项来调用各种 GET、HEAD、POST 和 PUT 请求。
此选项仅更改 HTTP 请求中使用的实际单词,不会更改 curl 的行为方式。因此,例如,如果您想发出正确的 HEAD 请求,使用 -X HEAD 是不够的。您需要使用 -I, --head 选项。
【讨论】:
【参考方案6】:对于受用户名和密码保护的服务,请使用以下
curl -u admin:password -X GET http://172.16.2.125:9200 -d '"sort":["lastUpdateTime":"order":"desc"]'
【讨论】:
curl -X POST -H "Content-type: application/json" -d '"stuff": "things"' http://... 如果我错了,请纠正我,但是在 curl 请求上使用 -d(而不是指定方法)将使请求成为 POST。【参考方案7】:由于某种原因,上述解决方案都不适合我。这是我的解决方案。这是非常基本的。
curl -X GET API_ENDPOINT -H 'Content-Type: application/json' -d 'JSON_DATA'
API_ENDPOINT 是您的 api 端点,例如:http://127.0.0.1:80/api
-H 已用于添加页眉内容。
JSON_DATA 是您的请求正文,可以是 :: "data_key": "value" 。 ' ' 包围 JSON_DATA 很重要。
-d之后的都是你需要在GET请求中发送的数据
【讨论】:
以上是关于带 json 参数的 curl GET 请求的主要内容,如果未能解决你的问题,请参考以下文章