使用curl请求发送包含绝对或相对路径的json文件

34

我想知道如何使用-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

当我指定一个在另一个目录中的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

我在curl的man页面中没有看到有关指定作为数据传递的文件的目录的内容。是否只能使用本地目录中的文件,还是有一种特殊的方式可以指定不同目录中的文件?感谢您的帮助。


不要忘记将头部指定为 application/json。 - Gilbert
1个回答

59

-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

感谢您的回复和解答。使用相对路径或绝对路径都不起作用,而且路径确实存在。您在运行命令时使用了哪个版本的curl?我的是curl 7.24.0(x86_64-apple-darwin12.0)libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5。我几乎已经快要崩溃了,因为您上面写的就是我做的事情,但它不起作用。 - Classified
curl 7.21.4(universal-apple-darwin11.0)libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5 - Perception
这可能是由于curl版本的差异引起的吗?JSON文件的路径是有效的。但是,当我在curl命令中使用该路径时,它不起作用。如果我运行curl命令并且文件在本地目录中,则可以正常工作。 - Classified
你确定你正在使用完整路径吗?或者如果你正在使用相对路径,它是否真的存在于你的工作目录中?我怀疑curl的版本是问题所在(虽然这可能是一个可能性)。 - Perception
1
哇,这太疯狂了。如果我在我的MacBook Pro上使用路径(绝对或相对)运行cmd,我一直收到400 Bad Request的错误。如果我在Centos VM上使用路径运行cmd,则可以正常工作。我没有想到在Mac终端和“真正”的Linux系统中运行cmd之间会有区别。@Perception感谢您的帮助并回答我的问题。 - Classified

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接