curlのJSONファイルを介してペイロードを渡す方法は?


201

curl次のコマンドを実行して、プレースを正常に作成できます。

$ curl -vX POST https://server/api/v1/places.json -d "
  auth_token=B8dsbz4HExMskqUa6Qhn& \
  place[name]=Fuelstation Central& \
  place[city]=Grossbeeren& \
  place[address]=Buschweg 1& \
  place[latitude]=52.3601& \
  place[longitude]=13.3332& \
  place[washing]=true& \
  place[founded_at_year]=2000& \
  place[products][]=diesel& \
  place[products][]=benzin \
"

サーバーはを返しますHTTP/1.1 201 Created
次に、ペイロードを次のようなJSONファイルに保存します。

// testplace.json
{
  "auth_token" : "B8dsbz4HExMskqUa6Qhn",
  "name" : "Fuelstation Central",
  "city" : "Grossbeeren",
  "address" : "Buschweg 1",
  "latitude" : 52.3601,
  "longitude" : 13.3332,
  "washing" : true,
  "founded_at_year" : 2000,
  "products" : ["diesel","benzin"]
}

したがって、実行するコマンドを次のように変更します。

$ curl -vX POST http://server/api/v1/places.json -d @testplace.json

これは戻りに失敗しますHTTP/1.1 401 Unauthorized。どうして?


1
また、バイナリファイルをアップロードする場合は、を使用する必要があることにも注意してください--data-binary
AhmetB-Google

回答:


329

curlデフォルトのコンテンツタイプでPOSTリクエストを送信しますapplication/x-www-form-urlencoded。JSONリクエストを送信する場合は、正しいコンテンツタイプヘッダーを指定する必要があります。

$ curl -vX POST http://server/api/v1/places.json -d @testplace.json \
--header "Content-Type: application/json"

しかし、これはサーバーがJSON入力を受け入れる場合にのみ機能します。.jsonURLの末尾があることを示すだけであり、出力が JSONである、それは必ずしも、それはまた、JSONの処理することを意味するものではありません入力を。APIドキュメントは、それがそうであるかどうかについてのヒントをあなたに与えるべきです。

あなたが得る理由401サーバーを抽出することはできませんのではなく、いくつかの他の誤差がある可能性がありauth_token、あなたのリクエストから。


8
この回答から使えることがわかるまでcat file.json、を使ってみたところ-d困っていました@file.json。ありがとう:)
shadi

1
複数のヘッダーが必要な場合は、少なくともUbuntuのbashでテストした場合は-H/を--header複数回指定する必要があることに注意してください。
Chaim Eliyah 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.