URL'yi curl komutunda kodlamanın bir yolu var mı?


107

Sorgu paramında boşluğu olan bir URL var. Bunu curl'da kullanmak istiyorum, örneğin

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"

hangi verir

Malformed Request-Line

Anladığım kadarıyla o / p, sorgu paramında bulunan alandan kaynaklanıyor.

Url'yi curl komutunu vermeden önce otomatik olarak kodlayacak başka bir yer var mı?

Yanıtlar:


170

curlurl kodlamasını dahili olarak destekler --data-urlencode:

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

-G Verileri URL’ye eklemek için de gereklidir.

İzleme başlıkları

> 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: */*

Ya eğer msg = '='?
Aurélien Ooms

Curl doc'dan: İsim kısmının (bu durumda msg) zaten URL kodlu olması gerektiğini unutmayın. Ayrıca --request DELETE gibi bir şey belirleyebilirsiniz; bu gerçekten bir GET yerine bir silme yöntemi olacaktır. Sipariş önemli olup olmadığından emin değil.
Federico,

@damphat, istek gibi iki parametre olduğunda ne olur "msg1=Hello&msg2=World"? Bu kodlar &sunucuya göndermek için yanlış bir şey anlamına geleceğini parametreler arasında
Ganesh Satpute

10
@ GaneshSatpute: --data-urlencodeHer anahtar-değer çifti için bir tane olan birden fazla parametre kullanın .
Martijn Pieters,

@MartijnPieters Evet. bu işe yarıyor. Cevap için teşekkürler
Ganesh Satpute

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

Bu $URLçevirileri yapmak istediğiniz URL adresi nerede ?

Ayrıca, bir URL’de sahip olabileceğiniz birden fazla çeviri türü (kodlama) vardır, bu nedenle yapmak isteyebilirsiniz:

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

yerine.


1
URL’de karakterler echo "$URL" | sed 's/ /%20/'varsa, doğru olanı yapmayacağını unutmayın %. Ayrıca, boşluklar normal olarak +(ve +as %2b) olarak kodlanır . Güvenilir olan Perl çözümünü öneririm.
Gilles,

1
sed 's/ /%20/g'Çevirilecek birden fazla yeriniz varsa ...
sebthebert

Not Perl URI :: Escape modülünü kurmak zorunda kaldım.
buzz3791
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.