如何使用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命令。

  1. 安装并启动邮递员
  2. input您的url,post正文,请求标题等。
  3. 点击Code
  4. 从下拉列表中selectcURL
  5. 复制并粘贴您的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参数。