¿Por qué curl trunca esta cadena de consulta?


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

Estoy usando curl en la línea de comandos para probar algunos puntos finales en una aplicación python. El punto final toma parámetros de url de latitud y longitud. Nada muy especial. Puse 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, lon, no está siendo enviado. ¿Qué estoy haciendo mal? Gracias.

Author: DeaconDesperado, 2012-02-01

2 answers

La respuesta a la pregunta, "qué estoy haciendo mal", es que el shell ve el ampersand (&) y piensa que es el final del comando (y lo pone en segundo plano). Necesitas citarlo, por lo que las respuestas que citan la cadena funcionan. Podrías simplemente ejecutar esto:

curl -v -L "http://localhost:5000/pulse/?lat=41.225&lon=-73.1"
 173
Author: Bob Kimble,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-22 05:24:48

Creo que puedes probar esto:

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

Por defecto, esto llama a 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 ya que está utilizando localhost, si utilizara https, probablemente querrá incluir -k como una opción para ignorar los errores de certificado

Gracias a Ross por señalar esto.

 31
Author: Nishant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:43