web-dev-qa-db-ja.com

curl要求でjsonファイルを絶対パスまたは相対パスで送信する

-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のマニュアルページには何も表示されませんでした。残念ながらローカルディレクトリ内のファイルに制限されていますか、それとも異なるディレクトリ内のファイルを指定する特別な方法がありますか?よろしくお願いします。

27
Classified

-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
50
Perception