Warum schneidet Curl diese Abfragezeichenfolge ab?

89

Ich bin sicher, die Antwort darauf wird ein schmerzlich offensichtliches Problem bei der Zeichenkodierung sein ...

Ich verwende Curl in der Befehlszeile, um einige Endpunkte in einer Python-App zu testen. Der Endpunkt verwendet URL-Parameter für Breite und Länge. Nichts Besonderes. Ich habe den Befehl eingegeben:

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

Der Server antwortet mit einer ausführlichen Curl-Ausgabe:

* 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

In der zweiten Zeile dieses Dumps ist es offensichtlich, dass der zweite Parameter lonnicht gesendet wird. Was mache ich falsch? Vielen Dank.

DeaconDesperado
quelle
1
Wahrscheinlich nichts mit der ursprünglichen Frage zu tun, aber wenn mir ein Teil der Abfragezeichenfolge fehlte, würde ich eine 400 oder etwas anderes zurückgeben, keine 500.
Michael Munsey

Antworten:

241

Die Antwort auf die Frage "Was mache ich falsch?" Lautet, dass die Shell das kaufmännische Und ( &) sieht und denkt, dass dies das Ende des Befehls ist (und es in den Hintergrund stellt). Sie müssen es zitieren, weshalb die Antworten, die den String zitieren, funktionieren. Sie können dies genauso gut ausführen:

curl -v -L "http://localhost:5000/pulse?lat=41.225&lon=-73.1"
Bob Kimble
quelle
Ich habe das auf Gitbash unter Windows ohne großen Erfolg versucht
avi.elkharrat
34

Ich denke, Sie können dies versuchen:

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

Standardmäßig wird POST aufgerufen. Wenn Sie eine GET-Anfrage senden möchten

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

Mehr ...
und da Sie verwenden localhost, httpsmöchten Sie wahrscheinlich -kals Option zum Ignorieren von Zertifikatfehlern einschließen

Vielen Dank an Ross für diesen Hinweis.

Nishant
quelle
Würde funktionieren, wenn dies ein Beitrag wäre, aber leider müssen die Parameter als URL-Variablen über GET übergeben werden.
DeaconDesperado
4
Hast du versucht zu -Gwechseln?
Nishant
1
Haben Sie auch in Ihrem Fall (wie in Frage) versucht, Ihre URL mit einer Abfragezeichenfolge mit doppeltem Anführungszeichen zu umgeben?
Nishant
und da Sie localhost verwenden und https verwenden möchten, möchten Sie wahrscheinlich -k als Option einschließen, um Zertifikatfehler zu ignorieren.
Ross
Keine dieser Methoden funktioniert bei mir. Wenn Sie eine Zeichenfolge übergeben, wird diese immer leer angezeigt. Senden an den Grizzly-Server.
user3217883