2017-02-07 13 views
0

投稿リクエストをREST APIに送信しようとしています。 curlで-dオプションを指定してパラメータを渡すと、すべてうまく動作することに気付きました。例:curl:-dと--data-binaryオプションの違いは何ですか?

curl "https://mywebsite.com" -d "param1=x" -d "param2=y" -u "3SUHZb0sanKWrQ" 

しかし、(何のパラメータが受信されなかったかのように)、JSONオブジェクトと--data-バイナリ使用などの送信パラメータは、私は、APIからエラーを受信した場合。例:

curl "https://mywebsite.com" --data-binary $'{ "param1": "x", -d "param2":"y" }' -u "3SUHZb0sanKWrQ" 

私は2つのアプローチが同じ振る舞いをしていると思ったが、私は間違っていると思った。これら2つのアプローチの違いは何ですか?

P .: 2番目のリクエストは、実際のリクエストが、jsonオブジェクトとしてデータペイロードを持つangularJSの$ http.postであるため、Google Chromeで「curl as curl」オプションを選択したときに取得するカールリクエストです。 angularJSで何ができるのですか?

var data = { 
    "param1": "x", 
    "param2": "y" 
}; 

$http({ 
    url: "https://mywebsite.com", 
    method: 'POST', 
    data: data 
}).then(function successCallback(response){ 
    console.log(response); 
}, function errorCallback(response){ 
    console.log(response); 
}); 

ありがとうございます!

+0

-dは--dataの略です。 --data-binaryは別のオプションです。 – MarkSkayff

+0

'man curl'から:--data-binary(HTTP)これは、特別な処理をしないで指定されたとおりにデータを投稿します。 @を使用してデータを開始する場合、残りはファイル名でなければなりません。 *改行と改行が保存され、変換が行われないことを除いて--data-asciiと同様の方法でデータがポストされます* このオプションを何度か使用すると、最初のものに続くものはデータを追加します-d、--dataで説明されているように。 – drew010

答えて

1

これは私がcurl --helpで得たものである:だから

-d, --data DATA  HTTP POST data (H) 
    --data-raw DATA HTTP POST data, '@' allowed (H) 
    --data-ascii DATA HTTP POST ASCII data (H) 
    --data-binary DATA HTTP POST binary data (H) 
    --data-urlencode DATA HTTP POST data url encoded (H) 
    --delegation STRING GSS-API delegation permission 
    --digest  Use HTTP Digest Authentication (H) 
    --disable-eprt Inhibit using EPRT or LPRT (F) 
    --disable-epsv Inhibit using EPSV (F) 
    --dns-servers DNS server addrs to use: 1.1.1.1;2.2.2.2 
    --dns-interface Interface to use for DNS requests 
    --dns-ipv4-addr IPv4 address to use for DNS requests, dot notation 
    --dns-ipv6-addr IPv6 address to use for DNS requests, dot notation§ 

、違いが送ら-dデータとバイナリコンテンツではないだけということです。

+0

すでに書かれていることを繰り返す説明が役に立たない。 – kev

1

-H "Content-Type: application/json"を追加する必要があると思います。

-d/--dataと同様に、Content-Type: application/x-www-form-urlencodedが送信されます。

-d/--data--data-binaryオプション

は、引数の同じ種類を期待するので、私はあなたが --data-binaryとすることを使用するときに、あなたがそうであるように、サーバーからの同じ応答を得るでしょう curl "https://mywebsite.com" -d $'{ "param1": "x", -d "param2":"y" }'をしようとするとかなり確信しています。

あなたが見ている違いは、2つのオプションの間の動作が異なるからではなく、オプションに与えている異なる引数のためです。

したがって、-Hオプションが指定されていないcurl "https://mywebsite.com" --data-binary $'{ "param1": "x", -d "param2":"y" }は、application/jsonメッセージのように見え、Content-Type: application/x-www-form-urlencodedヘッダーで送信されます。

サーバーはapplication/jsonではなくapplication/x-www-form-urlencodedと解釈し、実際にはフォームデータとして構成されていないため、正しく処理できません。curl manページ内の情報は、実際に、これは明確にしていませんが、違いはただです::

  • --data-binary送信限りオプションの違いは何であるかについての一般的な質問のようにとにかく

    改行または他の変更

  • -d/--dataストリップ改行(そしておそらくもリーディング/末尾のスペース)を剥離することなく、そのまま完全にデータ&は、他の変更
を行うことができます

だから、--data-binaryという名前はバイナリだけではなく、データを変更せずに正確に投稿するためです。 --data-as-isはより良い名前になります。

そして、前述したように、あなたがそれを変更する-H "Content-Type: …"を与えない限り、--data-binary-d/--data両方がapplication/x-www-form-urlencodedとしてPOSTを送信します。

関連する問題