2012-02-01 14 views
55

Sono sicuro che la risposta a questo sarà un problema di codifica dei caratteri dolorosamente ovvio ...Perché il curl sta troncando questa stringa di query?

Sto usando curl sulla riga di comando per testare alcuni endpoint in un'applicazione python. L'endpoint accetta i parametri url di latitudine e longitudine. Niente di troppo speciale. Ho messo nel comando:

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

Server risponde, con output dettagliato ricciolo:

* 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 quella discarica, è ovvio che il secondo parametro, lon, non viene inviato . Che cosa sto facendo di sbagliato? Grazie.

+0

Vuoi prendere in considerazione ri-accettare la risposta? Il secondo sembra più preciso. –

risposta

157

La risposta alla domanda "cosa sto facendo male" è che la shell vede la e commerciale (&) e pensa che è la fine del comando (e lo mette in secondo piano). Devi citarla, ed è per questo che le risposte che citavano la stringa funzionano. Si potrebbe altrettanto facilmente eseguire questo:

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

Assolutamente giusto. –

+4

Questa è la "risposta corretta" e dovrebbe essere accettata piuttosto che l'altra. –

+0

funziona come un fascino – Hammer

29

penso che si può provare questo:

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

per impostazione predefinita, ciò richiede POST. Se si desidera inviare una richiesta GET

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

Più ...
e dal momento che si sta utilizzando localhost, se si sceglie di usare https, si sarebbe probabilmente desidera includere -k come un'opzione per ignorare gli errori del certificato

grazie a Ross per indicare questo.

+0

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

+4

Hai provato l'opzione '-G'? – Nishant

+1

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

Problemi correlati