Dlaczego curl obcina ten ciąg zapytania?

90

Jestem pewien, że odpowiedzią na to będzie jakiś boleśnie oczywisty problem z kodowaniem znaków ...

Używam curl w wierszu poleceń do testowania niektórych punktów końcowych w aplikacji Pythona. Punkt końcowy przyjmuje parametry adresu URL zawierające szerokość i długość geograficzną. Nic specjalnego. Wpisałem polecenie:

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

Serwer odpowiada, wyświetlając szczegółowe dane wyjściowe curl:

* 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

W drugiej linii tego zrzutu jest oczywiste, że drugi parametr,, lonnie jest wysyłany. Co ja robię źle? Dzięki.

DeaconDesperado
źródło
1
Prawdopodobnie niezwiązane z pierwotnym pytaniem, ale jeśli brakowało mi części ciągu zapytania, zwróciłbym 400 lub coś innego, a nie 500.
Michael Munsey

Odpowiedzi:

246

Odpowiedź na pytanie „co robię źle” jest taka, że ​​powłoka widzi znak ampersand ( &) i myśli, że to koniec polecenia (i umieszcza go w tle). Musisz go zacytować, dlatego odpowiedzi, które cytowały ciąg, działają. Możesz równie łatwo uruchomić to:

curl -v -L "http://localhost:5000/pulse?lat=41.225&lon=-73.1"
Bob Kimble
źródło
Próbowałem tego na gitbash pod oknami bez większego sukcesu
avi.elkharrat
35

Myślę, że możesz spróbować tego:

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

domyślnie wywołuje POST. Jeśli chcesz wysłać żądanie GET

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

Więcej ...
a ponieważ używasz localhost, jeśli miałbyś używać https, prawdopodobnie chciałbyś dołączyć -kjako opcję ignorowania błędów certyfikatów

Dzięki Rossowi za wskazanie tego.

Nishant
źródło
Zadziałałoby, gdyby to był post, ale niestety parametry muszą zostać przekazane jako zmienne url przez GET.
DeaconDesperado
4
Czy próbowałeś -Gzmienić?
Nishant
1
czy nawet w twoim przypadku (jak w pytaniu) próbowałeś otoczyć adres URL ciągiem zapytania podwójnym cudzysłowem?
Nishant
a ponieważ używasz localhost, gdybyś używał protokołu https, prawdopodobnie chciałbyś dołączyć -k jako opcję ignorowania błędów certyfikatów.
Ross
Żadna z tych metod nie działa dla mnie. Przekazuje ciąg i zawsze wychodzi jako pusty. Wysyłanie na serwer Grizzly.
user3217883