113 votes

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

Je suis sûr que la réponse à cette question va être un problème d'encodage de caractères douloureusement évident...

J'utilise curl en ligne de commande pour tester quelques points de terminaison dans une application python. Le point de terminaison prend des paramètres d'url de latitude et de longitude. Rien de bien particulier. Je mets 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 cette décharge, il est évident que le deuxième param, lon n'est pas envoyé. Qu'est-ce qui ne va pas ? Je vous remercie.

286voto

Bob Kimble Points 2606

La réponse à la question "qu'est-ce que je fais de travers ?" 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 la citer, c'est pourquoi les réponses qui citent la chaîne de caractères fonctionnent. Vous pourriez tout aussi bien exécuter ceci :

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

36voto

Nishant Points 22758

Je pense que vous pouvez essayer ceci :

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

par défaut, il s'agit d'un appel 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 utilisez https vous voudrez probablement inclure -k comme option pour ignorer les erreurs de certificat

Merci à Ross pour l'avoir signalé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X