¿Por qué curl trunca esta cadena de consulta?

90

Estoy seguro de que la respuesta a esto será un problema de codificación de caracteres dolorosamente obvio ...

Estoy usando curl en la línea de comando para probar algunos puntos finales en una aplicación de Python. El punto final toma parámetros de URL de latitud y longitud. Nada muy especial. Pongo el comando:

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

El servidor responde, con una salida de curl detallada:

* 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

En la segunda línea de ese volcado, es obvio que el segundo parámetro, lonno se envía. ¿Qué estoy haciendo mal? Gracias.

Diácono Desesperado
fuente
1
Probablemente no esté relacionado con la pregunta original, pero si me faltara parte de la cadena de consulta, devolvería 400 o algo más, no 500.
Michael Munsey

Respuestas:

246

La respuesta a la pregunta, "qué estoy haciendo mal", es que el shell ve el ampersand ( &) y cree que ese es el final del comando (y lo pone en segundo plano). Debe citarlo, por lo que las respuestas que citaron la cadena funcionan. Podrías ejecutar esto con la misma facilidad:

curl -v -L "http://localhost:5000/pulse?lat=41.225&lon=-73.1"
Bob Kimble
fuente
Lo he estado intentando en gitbash bajo Windows sin mucho éxito
avi.elkharrat
35

Creo que puedes probar esto:

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

de forma predeterminada, esto llama POST. Si desea enviar una solicitud GET

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

Más ...
y dado que está usando localhost, si fuera a usar https, probablemente desee incluir -kcomo una opción para ignorar los errores de certificado

Gracias a Ross por señalar esto.

Nishant
fuente
Funcionaría si esto fuera una publicación, pero desafortunadamente los parámetros deben pasarse como variables de URL sobre GET.
DeaconDesperado
4
¿Intentaste -Gcambiar?
Nishant
1
incluso en su caso (como en la pregunta), ¿intentó rodear su URL con una cadena de consulta con comillas dobles?
Nishant
y dado que está usando localhost, si tuviera que usar https, probablemente querría incluir -k como una opción para ignorar los errores de certificado.
Ross
Ninguno de esos métodos funciona para mí. Pasando una cuerda y siempre aparece en blanco. Envío al servidor Grizzly.
user3217883