77

私の問題: 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シェルで動作するため、問題はリクエストに使用されるsintaxではないことがわかりました。

Windowsを使用している可能性がありますか?これは、完全に壊れたシェルのように見え、一重引用符と二重引用符を適切に処理しません。そのコマンドラインを試したところ、Linuxボックスで正常に機能しました。 http://curl.haxx.se/mail/archive-2011-03/0066.html

「それを逃れる」ものを回避しようとしましたが、それでもうまくいきませんでした

2.2。

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

3.3。

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

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

4

8 に答える 8

133

私はwin7x64ラップトップで同じ問題に遭遇し、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シェル構文をもっと好む。

于 2012-09-19T15:41:47.593 に答える
53

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

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

それから私の場合、私は発行します:

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

jsonも読みやすくします。

于 2014-01-13T09:14:41.620 に答える
17

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

単純なGET以外のHTTPメソッドを使用してデータを送信および要求するユーザーフレンドリーな方法を探している場合は、おそらくこのようなhttp://goo.gl/rVW22f AVANCEDRESTCLIENTと呼ばれる クロム拡張を探しています。

コマンドラインを使い続けたいと思っている人には、cygwinをお勧めします。

結局、CURLを使用してcygwinをインストールしました。これにより、WindowsでそのLinuxの感覚を得ることができます。

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

便利なリンク:

Windowsコマンドラインのcurlをダウンロードしていた場所はどこですか?

cygwinをインストールしてcurlを機能させる方法の詳細については、こちらをご覧ください。

私はこれに朝中過ごしたので、それが誰かに役立つことを願っています。

于 2012-08-07T11:56:22.840 に答える
11

少なくとも私がテストしたWindowsバイナリバージョン(現在7.33.0に基づくGeneric Win64 no-SSLバイナリ)では、コマンドライン引数の解析方法に制限があります。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
于 2015-05-13T19:55:17.163 に答える
7
  1. 一重引用符(')の代わりに二重引用符( ")を使用してみてください。
  2. JSON形式の引用符を保持するには、引用符を2倍にしてみてください( "")。
  3. データ内の引用符を保持するには、次のように二重引用符をエスケープしてみてください(\\ "")。

    curl ... -d "{""data1"": ""data1 goes here"", ""data2"": ""data2 goes here""}"
    curl ... -d "{""data"": ""data \\""abc\\"" goes here""}"
    
于 2015-02-18T20:13:14.553 に答える
4

PowerShell 6.2.3のもう1つの代替クロスプラットフォームソリューション:

$headers = @{
    'Authorization' = 'Token 12d119ad48f9b70ed53846f9e3d051dc31afab27'
}

$body = @"
{
    "value":"3.92.0", 
    "product":"847"
}
"@


$params = @{
    Uri         = 'http://local.vcs:9999/api/v1/version/'
    Headers     = $headers
    Method      = 'POST'
    Body        = $body
    ContentType = 'application/json'

}

Invoke-RestMethod @params
于 2019-10-23T15:04:40.343 に答える
1

JSONの二重引用符はエスケープする必要があり、JSON全体を二重引用符で囲む必要があります。手動でエスケープしたり、JSON用の追加ファイルを使用したりせずにこれを行うには、CMDの機能を使用して、変数内の文字列を次の場所にエスケープ"\"ます。

set json={"data1": "data goes here", "data2": "data2 goes here"}
curl -i -X POST -H 'Content-Type: application/json' -d "%json:"=\"%" http://localhost/path/to/api
于 2021-04-28T14:42:24.110 に答える
0

Windowsコマンドプロンプトで以下のCurlコマンドを使用して、リクエストを送信できます。以下のCurlコマンドを使用して、一重引用符を二重引用符に置き換え、以下の形式で存在しない引用符を削除して、^記号を使用します。

curl http://localhost:7101/module/url ^
  -d @D:/request.xml ^
  -H "Content-Type: text/xml" ^
  -H "SOAPAction: process" ^
  -H "Authorization: Basic xyz" ^
  -X POST
于 2020-09-09T09:16:10.963 に答える