Почему curl обрезает эту строку запроса?


90

Я уверен, что ответом на это будет какая-то до боли очевидная проблема с кодировкой символов ...

Я использую curl в командной строке для тестирования некоторых конечных точек в приложении Python. Конечная точка принимает параметры URL-адреса широты и долготы. Ничего особенного. Я ввел команду:

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

Сервер отвечает с подробным выводом curl:

* 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

Во второй строке этого дампа очевидно, что второй параметр lonне отправляется. Что я делаю не так? Спасибо.


1
Вероятно, не имеет отношения к исходному вопросу, но если бы мне не хватало части строки запроса, я бы вернул 400 или что-то еще, а не 500.
Майкл Манси

Ответы:


246

Ответ на вопрос «что я делаю не так?» Заключается в том, что оболочка видит амперсанд ( &) и думает, что это конец команды (и помещает ее в фоновый режим). Вам необходимо процитировать его, поэтому ответы, в которых указана строка, работают. Вы можете так же легко запустить это:

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

Я без особого успеха пробовал это на гитбаше под окнами
avi.elkharrat

35

Думаю, вы можете попробовать это:

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

по умолчанию это вызывает POST. Если вы хотите отправить запрос GET

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

Подробнее ...
и поскольку вы используете localhost, если бы вы использовали https, вы, вероятно, захотели бы включить -kв качестве опции игнорирование ошибок сертификата

Спасибо Россу за указание на это.


Будет работать, если это будет публикация, но, к сожалению, параметры должны быть переданы как переменные URL-адреса через GET.
DeaconDesperado 01

4
Вы пробовали -Gпереключиться?
Nishant

1
даже в вашем случае (как в вопросе) вы пытались окружить свой URL-адрес строкой запроса с двойной кавычкой?
Nishant

и поскольку вы используете localhost, если бы вы использовали https, вы, вероятно, захотели бы включить -k в качестве опции, чтобы игнорировать ошибки сертификата.
Росс

Ни один из этих методов у меня не работает. Передавая строку, она всегда оказывается пустой. Отправка на сервер Grizzly.
user3217883
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.