使用绝对路径或相对路径在curl请求中发送json文件

Cla*_*ied 27 rest json curl

只是想知道如何使用-d选项发送curl命令,指定一个文件及其路径,而不是当前目录中的文件.

当我尝试使用本地目录中的json文件测试我的应用程序时,这就是我所得到的.应用程序和我都很高兴:

curl -XPOST -H 'Content-Type:application/json' -d @all_fields.json http://testcomp.lab.net:8080/stats -v -s
* About to connect() to testcomp.lab.net port 8080
*   Trying 10.93.2.197... connected
* Connected to testcomp.lab.net (10.93.2.197) port 8080
> POST /stats HTTP/1.1
> User-Agent: curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
> Host: testcomp.lab.net:8080
> Accept: */*
> Content-Type:application/json
> Content-Length: 2882
> Expect: 100-continue
> 
< HTTP/1.1 100 Continue
HTTP/1.1 200 OK
< Content-Length: 0
* Connection #0 to host testcomp.lab.net left intact
* Closing connection #0
Run Code Online (Sandbox Code Playgroud)

当我指定另一个目录中的json文件时,这就是我所得到的

curl -XPOST -H 'Content-Type:application/json' -d @json/all_fields.json http://testcomp.lab.net:8080/stats -v -s
"Invalid json for Java type interface java.util.List"
Warning: Couldn't read data from file "json/all_fields.json", this makes an 
Warning: empty POST.

<snip snip>
<snip snip>

< HTTP/1.1 400 Bad Request
< Content-Type: application/json
< Transfer-Encoding: chunked
* Connection #0 to host testcomp.lab.net left intact
* Closing connection #0
Run Code Online (Sandbox Code Playgroud)

我没有在curl的手册页中看到任何指定文件作为数据传入的目录的内容.遗憾的是,我只限于本地目录中的文件,还是有一种特殊的方法来指定不同目录中的文件?在此先感谢您的帮助.

Per*_*ion 50

-d @命令选项接受任何解析文件的路径,只要路径确实存在.所以你可以使用:

  • 相对于当前目录的路径
  • 一条完全合格的道路
  • 一条带有软链接的路径
  • 等等

也就是说,就像数百个其他*Nix样式命令一样.一个快速说明,该-d选项将尝试对您的数据进行url编码,这些数据来自您描述的实际上并不是您想要的.您应该使用该--data-binary选项.像这样的东西:

curl -XPOST
     -H 'Content-Type:application/json'
     -H 'Accept: application/json'
     --data-binary @/full/path/to/test.json
     http://localhost:8080/easy/eservices/echo -v -s
Run Code Online (Sandbox Code Playgroud)