rest - curl如何POST JSon数据 Terminal / Commandline Test Spring REST ?

  显示原文与译文双语对照的内容

我使用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日志:"发布/ui/webapp/conf/clear http/1.1" 415 1051

关于Curl命令的正确格式的任何想法?

编辑:

这是我的Java服务器端代码( 我已经测试了get获取和删除 and,它们都在运行)


@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 设置为应用程序/json 。 但是 -d 发送 Content-Type 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

尝试将数据放入一个文件,比如 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端点,它就会给你输入和发送命令。 ( 从主页改编的例子)


$ 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

此外,通常还需要添加内容类型标头。 但是,你可以一次设置一个默认的添加配置文件 per-method per-site: 设置默认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 是一个具有id属性的简单 POJO 。

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


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

对于 Windows 对于-d值的单引号不起作用,它在改为双引号后工作。 还需要转义括号内的doble引号

那是不工作


curl -i -X POST -H"Content-Type: application/json" -d '{"key":"val"}' http://localhost:8080/appname/path

但是下面的工作


curl -i -X POST POST -H"Content-Type: application/json" -d"{"key":"val"} http://localhost:8080/appname/path

如果你正在测试很多对restfuljson发送/响应接口,你可能希望查看"邮差"plug-in为 Chrome ( 它允许你手动定义web服务测试) 及其 Node.js-based"Newman"command-line同伴( 它允许你自动测试测试"集合"邮差测试。) 都免费开放!

使用 CURL Windows,尝试:


curl -X POST -H"Content-Type:application/json" -d"{"firstName": "blablabla","lastName": "dummy","id": "123456"}" http-host/_ah/api/employeeendpoint/v1/employee

这对我来说很好,另外使用了基本的认证:


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和检查过的证书的基本认证。

我使用以下格式来测试web服务器

使用 -F'json数据''

假设 json dict格式:


{
 'comment': {
 'who':'some_one',
 'desc' : 'get it'
 }
}

完整示例


curl -XPOST your_address/api -F comment='{"who":"some_one","desc":"get it"}'

...