使用json参数卷曲GET请求


124

我试图通过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。


您的服务器端发布了哪些错误?
恐怖袋熊2014年

没有错误,服务器端它正在成功执行。但是从卷曲的角度来看,它不显示任何数据。几秒钟后它会ping通,它只显示无数据的空白。
Pradeep Simha 2014年

你可以尝试curl -i -H“ Accept:application / json”“ server:5050 / a / c / getName {” param0“:” pradeep“}”(选项-i代替x)。
Harshal Bulsara 2014年

Answers:


139

这应该工作:

  curl -i -H "Accept: application/json" 'server:5050/a/c/getName{"param0":"pradeep"}'

使用选项-i而不是x。


4
也许不同的报价?“服务器:5050 / a / c / getName {'param0':'pradeep'}”
AB

确实应该是'server:5050/a/c/getName{"param0":"pradeep"}'"server:5050/a/c/getName{\"param0\":\"pradeep\"}"
本杰明·

16

如果要在体内发送数据,则必须用POSTPUT代替GET

对我来说,您似乎要发送带有uri参数查询,该参数与无关GET,您也可以将这些参数放在上POSTPUT依此类推。

该查询是一个可选的部分,由问号(“?”)分隔,其中包含本质上不是分层的其他标识信息。查询字符串语法不是通用定义的,但通常组织为=对的序列,其中的对用分号或&分隔。

例如:

curl http://server:5050/a/c/getName?param0=foo&param1=bar

7
任何HTTP请求消息都允许包含消息正文。由于GET语义,它对GET永远没有用-请求主体的内容(如果有的话)不应更改响应。
JarekPrzygódzki16年

12

如果您确实要提交正文中带有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"

大多数现代的Web服务器都接受这种类型的请求。


这无法产生预期的结果。使用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
Jacques

这取决于您的Web服务器是否在检查主体是否有GET请求,我承认这并不是完全标准的行为。像您说的那样使用url查询参数可能会更好。在获取请求上使用正文的一个问题是,浏览器无法通过浏览器历史记录进行导航来重播请求,尽管这对于XHR请求可能很好。
史蒂文·索罗卡

或者,如果在服务器端有足够的控制权,则可以做的是在json数据中添加一个特殊属性,例如“ method”:“ get”,在后请求中发送有效负载,并让服务器上的代码对此进行解释作为获取请求。
雅克

@Jacques当然可以,但是如果您控制服务器,则可以轻松地让服务器读取GET请求的正文。回到最初的问题,我认为整个切线是一个话题。重新阅读问题,我认为OP无法访问更改服务器的权限。
史蒂文·索罗卡

是的,这是真的。如果您控制服务器。您所做的以下声明(就像我说的那样)不会产生预期的结果,这激发了我的评论:“大多数现代Web服务器都接受这种类型的请求”。实际上,他们会接受您描述的请求,但是该请求将无法产生预期的结果。或者,您可能希望修改这样的语句:“大多数现代Web服务器都接受这种类型的请求,前提是您可以直接控制服务器端,但这是非标准的”
Jacques

8

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,则不是标准方法。


4

对于受用户名和密码保护的服务,请使用以下命令

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:// ...
keithpjolley

如果我错了,请纠正我,但是在curl请求上使用-d(而不指定方法)会使请求成为POST。
Gokigooooks

3

尝试

curl -G ...

代替

curl -X GET ...

通常,您不需要此选项。各种GET,HEAD,POST和PUT请求都可以通过使用专用的命令行选项来调用。

此选项仅更改HTTP请求中使用的实际单词,而不更改curl的行为方式。因此,例如,如果您要发出适当的HEAD请求,则使用-X HEAD将无法满足要求。您需要使用-I,--head选项。


1

由于某种原因,以上提到的解决方案都没有对我有用。这是我的解决方案。这很基本。

卷曲-X GET API_ENDPOINT -H '内容-类型:应用/ JSON' -d ' JSON_DATA '

API_ENDPOINT是您的api端点,例如:http : //127.0.0.1 : 80/ api

-H已用于添加标题内容。

JSON_DATA是您的请求正文,它可以是:: :: {“ data_key”:“ value”}。“”周围JSON_DATA是很重要的。

-d之后的任何内容都是您需要在GET请求中发送的数据

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.