题 如何使用Curl从终端/命令行发布JSON数据到测试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日志:     “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;
} 

2049
2017-08-24 08:51


起源


结帐 链接 对于春季3.2.0发布请求。 - AmirHd
有一个很好的帖子 使用Curl进行RESTful微服务的Ad Hoc测试 其中包含多个示例。 - upitau


答案:


您需要将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上,情况略有不同。查看评论主题。


3234
2017-08-24 09:12



我从命令中删除了-d选项但仍然相同。 - kamaci
对于可能仍然感到困惑的人来说,完整的语法是: curl -X POST -H "Content-Type: application/json" -d '{"key":"val"}' URL - Adam Tuttle
curl -X POST -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:3000/api/login  为我工作。 - shweta
对于Windows,json周围的单引号不起作用,我最终逃脱了双引号。 curl -X POST -H "Content-Type: application/json" -d "{ \"key1\": \"value1\" }" http://localhost:3000/api/method - hIpPy
对于Windows下的我,我需要使用此格式的引号来转义引号 "{ """key1""": """value1""" }"。这个答案也是: stackoverflow.com/questions/18314796/... - chodorowicz


试着把你的数据放在一个文件中 body.json 然后使用

curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf

426
2017-08-24 10:04



它返回404错误 - kamaci
你可能应该使用 --data-binary 选项而不是 --data。可以预期客户端按原样发送数据,但是 --data 从输入中剥离CR和LF。 - h2stein
使用带有内联json字符串的cUrl似乎是一场噩梦。需要改变双引号字符。使用这样的文件更好。 - Xtreme Biker
添加一个很重要 @ 文件名前的字符,否则无效。我只花了20分钟就撞到了这个废话...... - Radu Murzea
这样,您还可以在文件上运行JSON lint,以查看解析JSON时是否存在错误。 - datashaman


你可能会发现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选项


86
2018-01-12 19:10





它对我有用:

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属性。


69
2018-04-19 16:00





对于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

58
2018-06-30 22:12



仅供参考 - 看起来你错过了json身体周围的结束双引号 - acanby
对于我在Windows上,“围绕数据不起作用,没有引号工作 - rodedo
如果您使用的是PowerShell,请参阅 这个 回答。 - rsenna


例如,创建一个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

37
2018-01-05 23:10





这对我很有用。

curl -X POST --data @json_out.txt http://localhost:8080/

哪里,

-X 表示http动词。

--data 表示您要发送的数据。


32
2017-07-01 14:31



该 -X POST 在这个例子中是多余的 - Engineer Dollery