我使用Ubuntu并在其上安装了Curl。我想用Curl测试我的Spring REST应用程序。我在Java端编写了我的POST代码。但是,我想用Curl测试它。我正在尝试发布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代码(我测试了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;
}
您需要将content-type设置为application / json。但 -d
发送Content-Type application/x-www-form-urlencoded
,春天方面不接受。
看着 卷曲手册页,我想你可以用 -H
:
-H "Content-Type: application/json"
完整示例:
curl --header "Content-Type: application/json" \
--request POST \
--data '{"username":"xyz","password":"xyz"}' \
http://localhost:3000/api/login
(-H
是的缩写 --header
, -d
对于 --data
)
注意 -request POST
是 可选的 如果你使用 -d
,作为 -d
flag表示POST请求。
在Windows上,情况略有不同。查看评论主题。
试着把你的数据放在一个文件中 body.json
然后使用
curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf
你可能会发现resty有用:
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
此外,通常仍需要添加内容类型标头。但是,您可以执行一次设置默认的每站点每个方法添加配置文件: 设置默认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
例如,创建一个JSON文件params.json,并将此内容添加到它:
[
{
"environment": "Devel",
"description": "Machine for test, please do not delete!"
}
]
然后运行此命令:
curl -v -H "Content-Type: application/json" -X POST --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
表示您要发送的数据。