web-dev-qa-db-ja.com

カールポストデータの二重引用符の適切なエスケープ?

サーバーにJSONデータを送信して応答を読み取ることで、サーバーをテストしようとしています。

POST{"item":"value with spaces"}ですが、curlを使用すると、バックスラッシュと二重引用符が送信されることがわかります。

curl -d "{\"item\":\"value with spaces\"}" http://myserver.com/somerubyapp?get=stuff

サーバーは実際に"{\"item\":\"value with spaces\"}"文字列の両端の二重引用符、バックスラッシュ、その他すべてを含みます。

curlを間違って使用していますか、それともシェルの問題ですか、bashですか?

4
Adam Davis

それは一種のネクロポスティングですが、私は最近同じ問題を抱えており(バックエンドが異なります)、その理由は間違ったContent-Typeにあることがわかりました。デフォルトでは「text/plain」または「text/html」で、私の場合はcurl -H "Content-Type: application/json" -d ...問題を解決しました。

3
heathen

サーバー側を使用してパラメーターを印刷していますか?それはその方法からのアーチファクトかもしれません。

引用の両方の方法、すなわち。 "{\"...および'{"... 大丈夫です。

編集:私がほのめかしている効果の例を挙げましょう:

% irb -r json
>> h = {"item" => "value with spaces"}    # (1)
=> {"item"=>"value with spaces"}          # (2)
>> h.to_json
=> "{\"item\":\"value with spaces\"}"     # (3)
>> puts(h.to_json)
{"item":"value with spaces"}              # (4)
=> nil

(1)関連付けられた値を持つ単一のキーで構成されるハッシュテーブルを定義します。 irbは(2)の結果を表示します。これもハッシュテーブルです。 hのJSON表現を見ると、irbは(3)の内側の引用符をエスケープしていますが、(4)はバックスラッシュがそこに「本当に」ないことを示しています。

したがって、howパラメータをサーバーに出力する方法によっては、表示された表現になる可能性があります。

1
Stefan Schmiedl