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。但是,
看一下Curl的手册页,我想你可以用
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/json" -d"{ "key1": "value1" }" http://localhost:3000/api/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/json"</wyn>,而不仅仅是<wyn>"application/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"; } |
For Windows, having a single quote for the
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/ |
在哪里?
我也遇到了同样的问题。我可以通过指定
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参数中使用
另请参见传递带括号的URL进行卷曲。
您还可以将JSON内容放入一个文件中,并通过标准输入使用
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依赖项。