มีวิธีใดในการเข้ารหัส url ในคำสั่ง curl?


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 เกิดจากพื้นที่ที่มีอยู่ในพารามิเตอร์การสืบค้น

มีการเข้ารหัส URL โดยอัตโนมัติก่อนที่จะให้คำสั่ง curl หรือไม่?

คำตอบ:


170

curlรองรับการเข้ารหัส url ภายในด้วย--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 = '='?
Aurélien Ooms

จาก curl doc: โปรดทราบว่าส่วนชื่อ (msg ในกรณีนี้) คาดว่าจะได้รับการเข้ารหัส URL แล้ว นอกจากนี้คุณสามารถระบุสิ่งที่ต้องการ --request DELETE และมันจะเป็นวิธีการลบแทน GET ไม่แน่ใจว่าคำสั่งซื้อมีความสำคัญหรือไม่
Federico

@damphat สิ่งที่เกิดขึ้นเมื่อมีการร้องขอมีสองพารามิเตอร์เช่น"msg1=Hello&msg2=World"? นี้จะเข้ารหัส&ระหว่างพารามิเตอร์ซึ่งจะหมายถึงสิ่งที่ผิดที่จะส่งไปยังเซิร์ฟเวอร์
พระพิฆเนศ Satpute

10
@GaneshSatpute: ใช้--data-urlencodeพารามิเตอร์หลายตัวหนึ่งตัวสำหรับแต่ละคู่ของคีย์ - ค่า
Martijn Pieters

@MartijnPieters ใช่ ที่ได้ผล ขอบคุณสำหรับคำตอบ
Ganesh Satpute

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
โปรดทราบว่าecho "$URL" | sed 's/ /%20/'จะไม่ทำสิ่งที่ถูกต้องหากมี%อักขระใน URL นอกจากนี้ช่องว่างจะถูกเข้ารหัสตามปกติเป็น+(และ+เป็น%2b) ฉันแนะนำโซลูชัน Perl ซึ่งเชื่อถือได้
Gilles

1
sed 's/ /%20/g'หากคุณมีมากกว่าหนึ่งช่องว่างในการแปล ...
sebthebert

หมายเหตุฉันต้องติดตั้ง Perl URI :: Escape module
buzz3791
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.