如何通过curl来post JSON数据,从终端/命令行发布到测试Spring Rest?

How do I POST JSON data with Curl from a terminal/commandline to Test Spring REST?

我用Ubuntu安装了curl。我想用曲线测试我的弹簧休息应用程序。我在Java方面编写了我的邮政编码。不过,我想用卷发测试一下。我正在尝试发布JSON数据。示例数据如下:

1
{"value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true}

我使用这个命令:

1
2
3
4
5
curl -i \
    -H"Accept: application/json" \
    -H"X-HTTP-Method-Override: PUT" \
    -X POST -d"value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true \
    http://localhost:8080/xx/xxx/xxxx

它返回此错误:

1
2
3
4
5
HTTP/1.1 415 Unsupported Media Type
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 1051
Date: Wed, 24 Aug 2011 08:50:17 GMT

错误描述如下:

The server refused this request because the request entity is in a format not supported by the requested resource for the requested method ().

Tomcat日志:"post/ui/webapp/conf/clear http/1.1"415 1051

curl命令的正确格式是什么?

这是我的Java端EDOCX1 0码(我已经测试了GET和Delphi,它们工作):

1
2
3
4
5
6
@RequestMapping(method = RequestMethod.PUT)
public Configuration updateConfiguration(HttpServletResponse response, @RequestBody Configuration configuration) { //consider @Valid tag
    configuration.setName("PUT worked");
    //todo If error occurs response.sendError(HttpServletResponse.SC_NOT_FOUND);
    return configuration;
}


您需要将内容类型设置为application/json。但是,-d发送的内容类型是application/x-www-form-urlencoded,这在Spring方面是不可接受的。

看一下Curl的手册页,我想你可以用-H

1
-H"Content-Type: application/json"

完整例子:

1
2
3
4
5
6
7
8
9
curl --header"Content-Type: application/json" \
  --request POST \
  --data '{"username":"xyz","password":"xyz
<div class="suo-content">[collapse title=""]<ul><li>我从命令中删除了-d选项,但仍然相同。</li><li>@Kamaci我认为你不需要移除-d,只需要使用-h。</li><li>我尝试:curl-i-h"accept:application/json"-h"x-http-method-override:put"-x post-d"value":"30","type":"tip 3","targetmodule":"target 3","configurationgroup":null,"name":"configuration deneme 3","description":null,"identity":"configuration deneme 3","version":0,"systemid":3,"active":true localhost:8080/ui/webapp/conf</li><li>@Kamaci好吧,那么我恐怕如果没有访问您的服务器日志,我就帮不了您了。我目前无法访问任何SpringMVC项目。我将尝试在您的日志文件中查找HTTP查询路径,然后从中继续。也许您可以在这个问题上附加一个相关的日志位。</li><li>对于Windows,JSON周围的单引号不起作用,最后我转义了双引号。<wyn>curl -X POST -H"Content-Type: application&#47;json" -d"{ "key1": "value1" }" http:&#47;&#47;localhost:3000&#47;api&#47;method</wyn></li><li>对于我来说,在Windows下,我需要使用这种格式的引号来转义引号<wyn>"{"""key1""":"""value1""" }"</wyn>。还有这个答案:stackoverflow.com/questions/18314796/&hellip;</li><li>@乔多罗维奇,太可怕了!我只知道vb的语法!</li><li>@是的!这太可笑了。在这种情况下,我正在考虑更认真地转向尼克斯系统。</li><li>我对post请求有一些问题,但是通过大写的"application/json"解决了这个问题,因此如果您遇到415个错误,请检查大写。</li><li>如果在@requestbody上使用模型,请记住它不需要一个costructor</li><li>也可以通过使用<wyn>-d @-</wyn>作为<wyn>curl</wyn>选项来传输来自<wyn>STDIN</wyn>的JSON数据。</li><li><wyn>contentType</wyn>还是<wyn>Content-Type</wyn>?</li><li>@frozenflame头名称是带破折号的标题框,请参阅RFC。一些框架(如jquery)接受camelcase中的报头,并在内部将其转换为标题破折号,但curl并不擅长。</li><li>我不得不把数据放在周围而没有的地方,然后它就工作了。你会认为这是一种标准的方法。</li><li>要使用混合单报价和双报价,可以使用Git-Bash或其他第三方提供的终端</li><li>为什么windows版本的curl需要在json数据周围加双引号??太荒谬了</li><li>@亚当·塔特尔,你的评论为什么有这么多赞成票?在Ubuntu 14.04上使用curl时,您需要<wyn>"Content-Type: application&#47;json"</wyn>,而不仅仅是<wyn>"application&#47;json"</wyn>。这浪费了我很多时间…</li><li>@奥斯特洛克很抱歉浪费了你的时间。当我发布OSX时,它的语法对我很有用(没有重试)。我猜这只是一个平台差异。我想,上涨的选票来自它帮助过的人。</li><li>你能记下这可能在Windows上不起作用吗?Ctrl-F下面的"Windows"。</li><li>@Jaykeegan我添加了一个小注释,但我不会用这种奇怪的语法来污染我的帖子。</li><li>在调用JavaEDCX1×9方法的CURL命令时,我面临更奇怪的行为,在Linux中,我必须删除双引号。有人知道为什么吗?</li><li>就像<wyn>-d</wyn>或<wyn>--data</wyn>默认使用<wyn>POST</wyn>一样,<wyn>--data-urlencode</wyn>选项也是如此。</li><li>我在Linux上使用了-h'content-type:application/json;charset=utf-8',shell是utf-8..,但奇怪的是,删除charset参数也解决了我的问题。</li><li>即使在Windows下,如果在bash/git bash中,这也有效</li></ul>[/collapse]</div><hr>
<p>
Try to put your data in a file, say <wyn>body.json</wyn> and then use
</p>

[cc]curl -H"Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf


您可能会发现Resty很有用:https://github.com/micha/resty网站

它是一个包装圆曲线,简化了命令行REST请求。您将它指向您的API端点,它将提供放置和发布命令。(改编自主页的示例)

1
2
3
4
5
6
7
8
9
10
$ resty http://127.0.0.1:8080/data #Sets up resty to point at your endpoing
$ GET /blogs.json                  #Gets http://127.0.0.1:8080/data/blogs.json
                                   #Put JSON
$ PUT /blogs/2.json '{"id" : 2,"title" :"updated post","body" :"This is the new.
<hr>
<p>
It worked for me using:
</p>

[cc]curl -H"Accept: application/json" -H"Content-type: application/json" -X POST -d '{"id":100}' http://localhost/api/postJsonReader.do

它很高兴地被映射到弹簧控制器:

1
2
3
4
5
@RequestMapping(value ="/postJsonReader", method = RequestMethod.POST)
public @ResponseBody String processPostJsonData(@RequestBody IdOnly idOnly) throws Exception {
        logger.debug("JsonReaderController hit! Reading JSON data!"+idOnly.getId());
        return"JSON Received";
}

IdOnly是一个具有ID属性的简单POJO。


For Windows, having a single quote for the -d value did not work for me, but it did work after changing to double quote. Also I needed to escape double quotes inside curly brackets.

That is, the following did not work:

1
2
3
4
5
6
7
curl -i -X POST -H"Content-Type: application/json" -d '{"key":"val
<div class="suo-content">[collapse title=""]<ul><li>仅供参考-看起来您在JSON主体周围缺少右双引号</li><li>对于我来说,在Windows上,"围绕数据不起作用,没有引号可以代替"</li><li>如果您使用的是PowerShell,请参阅此答案。</li></ul>[/collapse]</div><hr><P>例如,创建一个json文件params.json,并将此内容添加到其中:</P>[cc][
    {
       "environment":"Devel",
       "description":"Machine for test, please do not delete!"
    }
]

然后运行此命令:

1
curl -v -H"Content-Type: application/json" -X POST --data @params.json -u your_username:your_password http://localhost:8000/env/add_server


This worked well for me.

1
curl -X POST --data @json_out.txt http://localhost:8080/

在哪里?

-X表示http动词。

--data表示要发送的数据。


我也遇到了同样的问题。我可以通过指定

1
-H"Content-Type: application/json; charset=UTF-8"

Using CURL Windows, try this:

1
2
3
4
5
6
7
8
9
curl -X POST -H"Content-Type:application/json" -d"{"firstName": "blablabla","lastName": "dummy","id": "123456\
<hr>
<p>
You can use Postman with its intuitive GUI to assemble your <wyn>cURL</wyn>命令。</P><li>安装并启动邮递员</li><li>输入你的网址,文章正文,请求标题等。</li><li>点击<wyn>Code</wyn>。</li><li>从下拉列表中选择<wyn>cURL</wyn>。</li><li>复制和粘贴您的<wyn>cURL</wyn>命令</li><P>注意:下拉列表中有几个自动生成请求的选项,这就是为什么我认为我的文章首先是必要的。</P><div class="suo-content">[collapse title=""]<ul><li>没有意识到这个功能包含在邮差中。谢谢你指出!</li></ul>[/collapse]</div><hr>
<p>
If you're testing a lot of JSON send/responses against a RESTful interface, you may want to check out the Postman plug-in for Chrome (which allows you to manually define web service tests) and its Node.js-based Newman command-line companion (which allows you to automate tests against"collections" of Postman tests.)  Both free and open!
</p>

<p><center>[wp_ad_camp_3]</center></p><hr><P>httpie是<wyn>curl</wyn>的推荐替代方案,因为您可以</P>[cc]$ http POST http://example.com/some/endpoint name=value name1=value1

它默认使用JSON,并将处理为您设置必要的头文件以及将数据编码为有效的JSON。还有:

1
Some-Header:value

对于邮件头,以及

1
name==value

用于查询字符串参数。如果您有大量的数据块,您也可以从文件中读取,并对其进行JSON编码:


这对我很有效,另外还使用了基本身份验证:

1
2
3
curl -v --proxy '' --basic -u Administrator:password -X POST -H"Content-Type: application/json"
        --data-binary '{"value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true}'
        http://httpbin.org/post

当然,如果没有SSL和检查过的证书,就不应该使用基本身份验证。

今天我又碰到了这个问题,用Cygwin的curl 7.49.1做窗户……当在json参数中使用--data--data-binary时,curl会感到困惑,并将json中的{}解释为URL模板。添加一个-g参数来关闭旋度球化修复了这个问题。

另请参见传递带括号的URL进行卷曲。


您还可以将JSON内容放入一个文件中,并通过标准输入使用--file-upload选项将其传递给curl,如下所示:

1
2
 echo 'my.awesome.json.function({"do" :"whatever
<hr><P>这对我很有用:</P>[cc]curl -H"Content-Type: application/json" -X POST -d @./my_json_body.txt http://192.168.1.1/json

我正在使用下面的格式来测试Web服务器。

1
use -F 'json data'

让我们假设这个json dict格式:

1
2
3
4
5
6
{
    'comment': {
        'who':'some_one',
        'desc' : 'get it'
    }
}

完整例子

1
2
3
4
5
6
7
8
9
curl -XPOST your_address/api -F comment='{"who":"some_one","desc":"get it
<p><center>[wp_ad_camp_4]</center></p><hr><P>使用-d选项添加有效负载</P>[cc]curl -X POST \
http://<host>:<port>/<path> \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"foo":"bar",
"lorem":"ipsum"
}'

此外:

使用-x post使用post方法

使用-h'accept:application/json'添加accept-type头

使用-h"content-type:application/json"添加content-type头


您可以传递所需格式的扩展名作为URL的结尾。如http://localhost:8080/xx/xxx/xx xx.json

http://localhost:8080/xx/xxx/xx xx.xml

注意:您需要在POM中添加杰克逊和JAXB Maven依赖项。