Perché curl tronca questa stringa di query?


90

Sono sicuro che la risposta a questo sarà un problema di codifica dei caratteri dolorosamente ovvio ...

Sto usando curl sulla riga di comando per testare alcuni endpoint in un'app Python. L'endpoint accetta i parametri URL di latitudine e longitudine. Niente di troppo speciale. Inserisco il comando:

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

Il server risponde, con un output curl dettagliato:

* 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

Sulla seconda riga di quel dump, è ovvio che il secondo parametro,, lonnon viene inviato. Che cosa sto facendo di sbagliato? Grazie.


1
Probabilmente non correlato alla domanda originale, ma se mi mancasse una parte della stringa di query restituirei un 400 o qualcos'altro, non un 500.
Michael Munsey

Risposte:


246

La risposta alla domanda "cosa sto facendo di sbagliato" è che la shell vede la e commerciale ( &) e pensa che sia la fine del comando (e lo mette in secondo piano). Devi citarla, ecco perché le risposte che hanno citato la stringa funzionano. Puoi altrettanto facilmente eseguire questo:

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

L'ho provato su Gitbash sotto Windows senza molto successo
avi.elkharrat

35

Penso che tu possa provare questo:

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

per impostazione predefinita, questo chiama POST. Se vuoi inviare una richiesta GET

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

Altro ...
e poiché stai usando localhost, se dovessi usare https, probabilmente vorrai includere -kcome opzione per ignorare gli errori del certificato

Grazie a Ross per averlo indicato.


Funzionerebbe se questo fosse un post, ma sfortunatamente i parametri devono essere passati come variabili URL su GET.
DeaconDesperado

4
Hai provato a -Gcambiare?
Nishant

1
anche nel tuo caso (come in questione) hai provato a racchiudere il tuo URL con una stringa di query con virgolette doppie?
Nishant

e poiché stai usando localhost, se dovessi usare https, probabilmente vorrai includere -k come opzione per ignorare gli errori del certificato.
Ross

Nessuno di questi metodi funziona per me. Passa una stringa e risulta sempre vuota. Invio al server Grizzly.
user3217883
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.