如何使用terminal/命令行的Curl POST JSON数据来testingSpring REST?
我使用Ubuntu并安装了Curl。 我想用Curl来testing我的Spring REST应用程序。 我在Java端写了我的POST代码。 但是,我想用Curl来testing它。 我想发布一个JSON数据。 一个示例数据是这样的:
{"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}
我使用这个命令:
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
它返回这个错误:
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
错误描述是这样的:
服务器拒绝了此请求,因为请求实体的格式不是所请求的方法()所请求的资源所支持的格式。
Tomcat日志:“POST / ui / webapp / conf / clear HTTP / 1.1”415 1051
有关Curl命令的正确格式的任何想法?
编辑:
这是我的Java端PUT代码(我testing了GET和DELETE,他们工作)
@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; }
你需要将你的内容types设置为application / json。 但-d
发送内容types的application/x-www-form-urlencoded
,这在Spring方面是不被接受的。
看curl手册页 ,我想你可以使用-H
:
-H "Content-Type: application/json"
完整的例子:
curl -H "Content-Type: application/json" -X POST -d '{"username":"xyz","password":"xyz"}' http://localhost:3000/api/login
( -H
代表--header
, -d
代表--data
)
请注意,如果使用-d
, -X POST
是可选的 ,因为-d
标志意味着POST请求。
在Windows上,情况稍有不同。 查看评论主题。
尝试把你的数据放在一个文件中,比如body.json
,然后使用
curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf
您可能会发现有用的: https : //github.com/micha/resty
这是一个CURL封装,它简化了命令行REST请求。 你把它指向你的API端点,它给你PUT和POST命令。 (从主页改编的例子)
$ 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."}' # POST JSON from a file $ POST /blogs/5.json < /tmp/blog.json
另外,通常仍然需要添加内容types标题。 但是,您可以这样做一次,以设置每个站点的每个方法的默认configuration文件: 设置默认的RESTY选项
它为我工作使用:
curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":100}' http://localhost/api/postJsonReader.do
它被愉快地映射到Spring控制器:
@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
是一个简单的POJO与id属性。
对于Windows而言,为-d
值引用单引号不适用于我,但在更改为双引号之后确实有效。 此外,我需要在大括号内跳过双引号。
也就是说,下面没有工作:
curl -i -X POST -H "Content-Type: application/json" -d '{"key":"val"}' http://localhost:8080/appname/path
但以下工作:
curl -i -X POST -H "Content-Type: application/json" -d "{\"key\":\"val\"}" http://localhost:8080/appname/path
例如,创build一个JSON文件params.json,并将其添加到该文件中:
[ { "environment": "Devel", "description": "Machine for test, please do not delete!" } ]
然后你运行这个命令:
curl -v -H "Content-Type: application/json" -XPOST --data "@params.json" -u your_username:your_password http://localhost:8000/env/add_server
这对我很好。
curl -X POST --data @json_out.txt http://localhost:8080/
哪里,
-X
表示http动词。
--data
要发送的数据。
我只是遇到了同样的问题。 我可以通过指定来解决它
-H "Content-Type: application/json; charset=UTF-8"
使用CURL Windows,试试这个:
curl -X POST -H "Content-Type:application/json" -d "{\"firstName\": \"blablabla\",\"lastName\": \"dummy\",\"id\": \"123456\"}" http-host/_ah/api/employeeendpoint/v1/employee
如果您正在testing大量针对RESTful界面的JSON发送/响应,则可能需要查看适用于Chrome的Postman插件(允许您手动定义Web服务testing)以及基于Node.js的Newman命令在线同伴(它允许您自动testing邮差testing的“集合”)。自由和开放!
这对我工作:
curl -H "Content-Type: application/json" -X POST -d @./my_json_body.txt http://192.168.1.1/json
这对我很好,另外使用BASICauthentication:
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和检查证书的BASICauthentication。
我今天再次遇到了这个问题,使用Cygwin的cURL 7.49.1 for Windows …当使用带有JSON参数的--data
或--data-binary
时,cURL感到困惑,并将JSON中的{}
解释为URL模板。 添加一个-g
参数来closurescURL globbing固定的。
另请参见传递带有括号的URL以curl 。
晚了一点,但我没有看到这张贴,所以在这里,你也可以把你的JSON在一个文件,并通过它使用 – file upload选项curl通过标准input,如下所示:
echo 'my.awesome.json.function({"do" : "whatever"})' | curl -X POST "http://url" -T -
我正在使用以下格式来testingWeb服务器。
use -F 'json data'
我们假设这个JSON字典格式:
{ 'comment': { 'who':'some_one', 'desc' : 'get it' } }
完整的例子
curl -XPOST your_address/api -F comment='{"who":"some_one", "desc":"get it"}'
您可以使用Postman及其直观的GUI来组装您的cURL
命令。
- 安装并启动邮递员
- input您的url,post正文,请求标题等。
- 点击
Code
- 从下拉列表中select
cURL
- 复制并粘贴您的
cURL
命令
注意:在下拉列表中有几个自动生成请求的选项,这就是为什么我认为我的职位是必需的。
对于json数据
curl -H "Content-Type: application/json" -X POST -d '{"params1":"value1","param2":"value2"}' http://localhost:8080/api
如果你想发布一些文件
curl -X POST -F "data=@/Users/vishvajitpathak/Desktop/screen_1.png" http://localhost:8080/upload --insecure
万一你不想搞乱https和http:
或简单地说,
curl -X POST -F "data=@/Users/vishvajitpathak/Desktop/screen_1.png" http://localhost:8080/upload
有很棒的HTTPie CLI工具。 有了它,你可以做到
$ http POST http://example.com/some/endpoint name=value name1=value1
等等,而且不用担心。 也有
Some-Header:value
为标题,和
name==value
查询string参数。