Adakah cara untuk menyandikan url dalam perintah curl?

107

Saya punya beberapa url yang memiliki ruang di param kueri itu. Saya ingin menggunakan ini dalam ikal, misalnya

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"

yang memberi tahu

Malformed Request-Line

Sesuai pemahaman saya o / p adalah karena ruang yang ada di param query.

Apakah ada cara untuk menyandikan url secara otomatis sebelum memberikannya ke perintah curl?

Aashish P.
sumber

Jawaban:

170

curlmendukung url-encoding secara internal dengan --data-urlencode:

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

-G juga perlu menambahkan data ke URL.

Lacak tajuk

> 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: */*
basah
sumber
Bagaimana jika msg = '='?
Aurélien Ooms
Dari curl doc: Perhatikan bahwa bagian nama (msg dalam hal ini) diharapkan sudah disandikan URL. Anda juga dapat menentukan sesuatu seperti --request DELETE dan itu akan menjadi metode hapus alih-alih GET. Tidak yakin jika pesanan penting.
Federico
@ apa yang terjadi ketika permintaan memiliki dua parameter seperti "msg1=Hello&msg2=World"? Ini akan menyandikan &antara parameter yang berarti mengirim sesuatu ke server salah
Ganesh Satpute
10
@ GaneshSatpute: gunakan beberapa --data-urlencodeparameter, satu untuk setiap pasangan nilai kunci.
Martijn Pieters
@ MartijnPieters Ya. itu bekerja. Terima kasih atas jawabannya
Ganesh Satpute
7
 curl -G "$( echo "$URL" | sed 's/ /%20/g' )"

Di mana $URLurl Anda ingin melakukan terjemahan.

Ada juga lebih dari satu jenis terjemahan (pengodean) yang dapat Anda miliki di URL, sehingga Anda mungkin ingin melakukannya:

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

sebagai gantinya.

Drav Sloan
sumber
1
Perhatikan bahwa echo "$URL" | sed 's/ /%20/'tidak akan melakukan hal yang benar jika ada %karakter di URL. Juga, spasi biasanya dikodekan sebagai +(dan +sebagai %2b). Saya merekomendasikan solusi Perl, yang dapat diandalkan.
Gilles
1
sed 's/ /%20/g'jika Anda memiliki lebih dari satu ruang untuk menerjemahkan ...
sebthebert
Catatan saya harus menginstal modul Perl URI :: Escape.
buzz3791