Чому curl скорочує цей рядок запиту?


90

Я впевнений, що відповіддю на це буде якась болюче очевидна проблема кодування символів ...

Я використовую curl у командному рядку для тестування деяких кінцевих точок у програмі python. Кінцева точка приймає параметри url широти та довготи. Нічого надто особливого. Я ввів команду:

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

Сервер відповідає, виводячи детальний випуск:

* 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"

Я намагався це зробити на gitbash під вікнами без особливого успіху
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

4
Спробували -Gпереключитись?
Нішант

1
навіть у вашому випадку (як і питання) ви намагалися оточити свою URL-адресу рядком запиту з подвійними лапками?
Нішант

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

Жоден із цих методів не працює для мене. Передаючи рядок, і він завжди виходить порожнім. Відправка на сервер Grizzly.
user3217883
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.