Pourquoi curl tronque-t-il cette chaîne de requête?

90

Je suis sûr que la réponse à cette question sera un problème de codage de caractères douloureusement évident ...

J'utilise curl sur la ligne de commande pour tester certains points de terminaison dans une application python. Le point de terminaison prend les paramètres d'URL de latitude et de longitude. Rien de spécial. J'ai mis la commande:

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

Le serveur répond, avec une sortie curl verbeuse:

* 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

Sur la deuxième ligne de ce vidage, il est évident que le deuxième paramètre,, lonn'est pas envoyé. Qu'est-ce que je fais mal? Merci.

DeaconDesperado
la source
1
Probablement sans rapport avec la question initiale, mais s'il me manquait une partie de la chaîne de requête, je retournerais un 400 ou autre chose, pas un 500.
Michael Munsey

Réponses:

246

La réponse à la question "qu'est-ce que je fais de mal?" Est que le shell voit l'esperluette ( &) et pense que c'est la fin de la commande (et la met en arrière-plan). Vous devez le citer, c'est pourquoi les réponses qui citent la chaîne fonctionnent. Vous pouvez tout aussi facilement exécuter ceci:

curl -v -L "http://localhost:5000/pulse?lat=41.225&lon=-73.1"
Bob Kimble
la source
J'ai essayé cela sur gitbash sous Windows sans grand succès
avi.elkharrat
35

Je pense que vous pouvez essayer ceci:

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

par défaut, cela appelle POST. Si vous souhaitez envoyer une requête GET

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

Plus ...
et puisque vous utilisez localhost, si vous deviez utiliser https, vous voudrez probablement inclure -kcomme option pour ignorer les erreurs de certificat

Merci à Ross de l' avoir signalé.

Nishant
la source
Cela fonctionnerait si c'était post, mais malheureusement, les paramètres doivent être passés en tant que variables d'url sur GET.
DeaconDesperado
4
Avez-vous essayé de -Gchanger?
Nishant
1
même dans votre cas (comme en question) avez-vous essayé d'entourer votre URL avec une chaîne de requête avec des guillemets doubles?
Nishant
et puisque vous utilisez localhost, si vous deviez utiliser https, vous voudriez probablement inclure -k comme option pour ignorer les erreurs de certificat.
Ross
Aucune de ces méthodes ne fonctionne pour moi. Passer une chaîne et elle revient toujours comme vierge. Envoi au serveur Grizzly.
user3217883