curlコマンドでURLをエンコードする方法はありますか?


107

クエリパラメータにスペースがあるURLがあります。カールでこれを使用したい、例えば

curl -G "http://localhost:30001/data?zip=47401&utc_begin=2013-8-1 00:00:00&utc_end=2013-8-2 00:00:00&country_code=USA"

配る

Malformed Request-Line

私の理解によると、o / pはクエリパラメータに存在するスペースによるものです。

curlコマンドに提供する前にURLを自動的にエンコードする場所はありますか?

回答:


170

curlで内部的にurl-encodingをサポートします--data-urlencode

$ curl -G -v "http://localhost:30001/data" --data-urlencode "msg=hello world" --data-urlencode "msg2=hello world2"

-G URLにデータを追加するためにも必要です。

トレースヘッダー

> GET /data?msg=hello%20world&msg2=hello%20world2 HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu)
> Host: localhost
> Accept: */*

もしもし msg = '='
オーレリアンオームズ

curl docから:名前部分(この場合はmsg)は、既にURLエンコードされていると予想されることに注意してください。また、--request DELETEのようなものを指定することもできます。これは実際にはGETではなく削除メソッドになります。順序が重要かどうかわかりません。
フェデリコ

@damphatリクエストに次のような2つのパラメータがある場合はどうなります"msg1=Hello&msg2=World"か?これは、エンコードする&サーバに送信する間違ったことを意味しますパラメータ間
ガネーシュSatpute

10
@GaneshSatpute:--data-urlencode各キーと値のペアに1つずつ、複数のパラメーターを使用します。
ピーターズ

@MartijnPietersはい。動作します。答えてくれてありがとう
ガネーシュサットーテ

7
 curl -G "$( echo "$URL" | sed 's/ /%20/g' )"

$URL翻訳を行うURLはどこですか。

また、URLに含めることができる翻訳(エンコード)のタイプは複数あるため、次のようにすることができます。

curl -G "$(perl -MURI::Escape -e 'print uri_escape shift, , q{^A-Za-z0-9\-._~/:}' -- "$URL")"

代わりに。


1
URLに文字が含まれてecho "$URL" | sed 's/ /%20/'いる場合、正しいことは行われないことに注意してください%。また、スペースは通常+(および)+としてエンコードされ%2bます。信頼できるPerlソリューションをお勧めします。
ジル

1
sed 's/ /%20/g'翻訳するスペースが複数ある場合
...-sebthebert

注:Perl URI :: Escapeモジュールをインストールする必要がありました。
buzz3791
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.