Bất kỳ cách nào để mã hóa url trong lệnh curl?


107

Tôi có một số url có không gian trong thông số truy vấn của nó. Tôi muốn sử dụng cái này trong curl, vd

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"

đưa ra

Malformed Request-Line

Theo hiểu biết của tôi, o / p là do không gian có trong truy vấn param.

Có cách nào để mã hóa url tự động trước khi cung cấp cho lệnh curl không?

Câu trả lời:


170

curlhỗ trợ mã hóa url trong nội bộ với --data-urlencode:

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

-G cũng cần thiết để nối dữ liệu vào URL.

Tiêu đề dấu vết

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

Nếu như msg = '='?
Aurélien Ooms

Từ tài liệu curl: Lưu ý rằng phần tên (thông điệp trong trường hợp này) dự kiến ​​đã được mã hóa URL. Ngoài ra, bạn có thể chỉ định một cái gì đó như --request DELETE và nó thực sự sẽ là một phương thức xóa thay vì GET. Không chắc chắn nếu vấn đề đặt hàng.
Federico

@damphat chuyện gì xảy ra khi yêu cầu có hai tham số như thế "msg1=Hello&msg2=World"nào? Điều này sẽ mã hóa &giữa các tham số có nghĩa là điều sai gửi đến máy chủ
Ganesh Satpute

10
@GaneshSatpute: sử dụng nhiều --data-urlencodetham số, một tham số cho mỗi cặp khóa-giá trị.
Martijn Pieters

@MartijnPieters Có. mà làm việc Cảm ơn câu trả lời
Ganesh Satpute

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

Địa $URLchỉ bạn muốn thực hiện các bản dịch trên.

Ngoài ra còn có nhiều loại dịch thuật (mã hóa) mà bạn có thể có trong một URL, vì vậy bạn có thể muốn thực hiện:

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

thay thế.


1
Lưu ý rằng echo "$URL" | sed 's/ /%20/'sẽ không làm điều đúng nếu có các %ký tự trong URL. Ngoài ra, không gian thường được mã hóa thành +(và +như %2b). Tôi đề nghị giải pháp Perl, đáng tin cậy.
Gilles

1
sed 's/ /%20/g'nếu bạn có nhiều khoảng trống để dịch ...
sebthebert

Lưu ý tôi đã phải cài đặt mô-đun Perl URI :: Escape.
buzz3791
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.