Tại sao curl lại cắt ngắn chuỗi truy vấn này?


89

Tôi chắc rằng câu trả lời cho điều này sẽ là một số vấn đề về mã hóa ký tự rõ ràng ...

Tôi đang sử dụng curl trên dòng lệnh để kiểm tra một số điểm cuối trong ứng dụng python. Điểm cuối nhận các tham số url của vĩ độ và kinh độ. Không có gì quá đặc biệt. Tôi đặt lệnh:

curl -v -L http://localhost:5000/pulse/?lat=41.225&lon=-73.1

Máy chủ phản hồi, với đầu ra dài dòng:

* Connected to localhost (127.0.0.1) port 5000 (#0)
> GET /pulse/?lat=41.225 HTTP/1.1
> User-Agent: curl/7.21.6 (i686-pc-linux-gnu) libcurl/7.21.6 OpenSSL/1.0.0e zlib/1.2.3.4 libidn/1.22 librtmp/2.3
> Host: localhost:5000
> Accept: */*
> 
* HTTP 1.0, assume close after body
< HTTP/1.0 500 INTERNAL SERVER ERROR
< Content-Type: application/json
< Content-Length: 444
< Server: Werkzeug/0.8.1 Python/2.7.2+
< Date: Wed, 01 Feb 2012 17:06:29 GMT
< 
{
    "msg": "TypeError: float() argument must be a string or a number", 
    "flag": 0, 
    "stack": [
        "Traceback (most recent call last):", 
        "  File \"engine.py\", line 139, in dispatch_request", 
        "    return getattr(self, 'action_'+endpoint)(request, **values)", 
        "  File \"engine.py\", line 818, in action_getpulse", 
        "    lon = float(request.args.get('lon'))"
    ], 
    "err": 1
* Closing connection #0
}
[1]+  Done

Trên dòng thứ hai của kết xuất đó, rõ ràng là thông số thứ hai lon, không được gửi. Tôi đang làm gì sai? Cảm ơn.


1
Có lẽ không liên quan đến câu hỏi ban đầu, nhưng nếu tôi nhớ da diết một phần của chuỗi truy vấn tôi sẽ trả về một 400 hay cái gì khác, không phải là một 500.
Michael Munsey

Câu trả lời:


245

Câu trả lời cho câu hỏi, "tôi đang làm gì sai", là shell nhìn thấy dấu và ( &) và nghĩ rằng đó là phần cuối của lệnh (và đặt nó vào nền). Bạn cần phải trích dẫn nó, đó là lý do tại sao các câu trả lời trích dẫn chuỗi hoạt động. Bạn có thể dễ dàng chạy điều này:

curl -v -L "http://localhost:5000/pulse?lat=41.225&lon=-73.1"

Tôi đã thử điều đó trên gitbash dưới windows mà không thành công nhiều
avi.elkharrat

35

Tôi nghĩ bạn có thể thử điều này:

 curl -v -L -d "lat=41.225&lon=-73.1" http://localhost:5000/pulse

theo mặc định, điều này gọi POST. Nếu bạn muốn gửi một yêu cầu GET

 curl -v -L -G -d "lat=41.225&lon=-73.1" http://localhost:5000/pulse

Thêm ...
và vì bạn đang sử dụng localhost, nếu bạn đã sử dụng https, bạn có thể muốn đưa vào -knhư một tùy chọn để bỏ qua lỗi chứng chỉ

Cảm ơn Ross đã chỉ ra điều này.


Sẽ hoạt động nếu điều này được đăng, nhưng tiếc là các tham số phải được chuyển dưới dạng biến url qua GET.
DeaconDesperado

4
Bạn đã thử -Gchuyển đổi chưa?
Nishant

1
ngay cả trong trường hợp của bạn (như trong câu hỏi) bạn đã thử bao quanh URL của mình bằng chuỗi truy vấn với dấu ngoặc kép chưa?
Nishant

và vì bạn đang sử dụng localhost, nếu bạn đang sử dụng https, bạn có thể muốn bao gồm -k làm tùy chọn để bỏ qua lỗi chứng chỉ.
Ross

Không có phương pháp nào hiệu quả với tôi. Vượt qua một chuỗi và nó luôn ở dạng trống. Đang gửi đến máy chủ Grizzly.
user3217883 13/03/18
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.