web-dev-qa-db-ja.com

WINDOWS RESTfulサービスのcURL POSTコマンドライン

私の問題:POSTリクエストとともにいくつかのデータを送信している間にコマンドラインツールを使用してローカルホストサーバーをカールします。

エラーの原因と思われるもの:このようなものを想像してください

  1. curl -i -X POST -H 'Content-Type: application/json' -d '{"data1": "data goes here", "data2": "data2 goes here"}' http:localhost/path/to/api

返されるデータの結果

curl: (6) Could not resolve Host: application; No data record of requested type
curl: (6) Could not resolve Host: data goes here,; No data record of requested type
curl: (6) Could not resolve Host: data2; No data record of requested type
curl: (3) [globbing] unmatched close brace/bracket at pos 16

いくつかの検索の後、UNIXシェルで機能するため、問題はリクエストに使用される構文ではないことがわかりました。

Windowsを使用している可能性がありますか?これは、シングルクォートとダブルクォートを適切に処理しない、完全に壊れたシェルのように見えます。私はちょうどそのコマンドラインを試してみましたが、私のlinuxボックスでうまく機能しました。 http://curl.haxx.se/mail/archive-2011-03/0066.html

私はそれらを回避するために「それをエスケープ」しようとしましたが、それでも動作しませんでした

2。

curl -i -X POST -H 'Content-Type:application/json' -d '{\ "data1 \":\ "data goes here \"、\ "data2 \":\ "data2 goes here\"} 'http:// localhost/path/to/api

3。

curl -i -X POST -H 'Content-Type:application/json' -d '{\ "data1 \":\ "data goes here \"、\ "data2 \":\ "data2 goes here\"} 'http:// localhost/path/to/api

だから私はあきらめた。 WindowsはPOSTで送信されたJSONオブジェクトを台無しにしているようです

55
Lothre1

私はwin7 x64ラップトップで同じ問題に遭遇し、非常によく似たコマンドライン形式を使用して Win64-Generic w SSL というラベルの付いたcurlリリースを使用して動作させることができました。

C:\Projects\curl-7.23.1-win64-ssl-sspi>curl -H "Content-Type: application/json" -X POST http://localhost/someapi -d "{\"Name\":\"Test Value\"}"

エスケープされたものとヘッダーパラメータ値を二重引用符で囲むことで、2番目のエスケープバージョンとのみ異なります。間違いなくLinuxシェルの構文を好むでしょう。

107
user1683523

引用符で戦うよりも簡単なコマンドラインの別の代替方法は、jsonをファイルに入れ、curlパラメーターの@プレフィックスを使用することです。 json.txtに次のようにします。

{ "syncheader" : {
    "servertimesync" : "20131126121749",
    "deviceid" : "testDevice"
  }
}

私の場合、私は以下を発行します:

curl localhost:9000/sync -H "Content-type:application/json" -X POST -d @json.txt

JSONも読みやすくします。

44
wwkudu

代替ソリューション:コマンドラインよりもユーザーフレンドリーなソリューション:

単純なGET以外のHTTPメソッドを使用してデータを送信および要求するユーザーフレンドリーな方法を探している場合、おそらくこのようなchrome拡張を探しているでしょう http://goo.gl/rVW22f 呼び出し済みAVANCED REST CLIENT

コマンドラインにとどまりたい人には、cygwinをお勧めします:

最終的に、CURLを使用してcygwinをインストールすることで、Linuxの感覚をWindowsで取得できます!

Cygwinコマンドラインを使用すると、この問題は停止し、最も重要でした。1で使用された要求構文は正常に機能しました。

便利なリンク:

Windowsのコマンドラインのcurlをダウンロードしていた場所

cygwinでcurlをインストールして動作させる方法の詳細については、ここを参照してください

私はこれに朝一晩を費やしたので、それが誰かを助けることを願っています

16
Lothre1

少なくとも、テストしたWindowsバイナリバージョン( Generic Win64 no-SSL binary 、現在は 7.33. に基づいています)では、コマンドの実行方法に制限があります行引数が解析されています。 xmasによる答えは、その設定の正しい構文を説明しており、バッチファイルでも機能します。提供されている例を使用します。

curl -i -X POST -H "Content-Type: application/json" -d "{""data1"":""data goes here"",""data2"":""data2 goes here""}" http:localhost/path/to/api

コマンドラインの解析に使用されるライブラリに依存するエスケープ文字を処理する必要を回避するためのよりクリーンな代替方法は、標準のjson形式のテキストを別のファイルに保存することです。

curl -i -X POST -H "Content-Type: application/json" -d "@body.json" http:localhost/path/to/api
8
mysteryegg
  1. 単一引用符( ')の代わりに二重引用符( ")を使用してください。
  2. JSON形式の引用符を保持するには、二重引用符( "")を試してください。
  3. データ内の引用符を保持するには、次のように二重にエスケープしてみてください(\\ "")。

    curl ... -d "{""data1"": ""data1 goes here"", ""data2"": ""data2 goes here""}"
    curl ... -d "{""data"": ""data \\""abc\\"" goes here""}"
    
4
xmas