2012-02-01 41 views
55

我敢肯定,這將是一些痛苦的明顯的字符編碼問題的答案...爲什麼curl會截斷這個查詢字符串?

我使用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 

在該轉儲的第二行,很明顯,第二PARAM,lon,不被髮送。我究竟做錯了什麼?謝謝。

+0

你會考慮重新接受答案嗎?第二個看起來更精確。 – 2016-08-06 17:07:30

回答

157

對於「我做錯了什麼」這個問題的答案是shell看到&符號(&),並認爲這是命令的結尾(並將其放入後臺)。你需要引用它,這就是爲什麼引用字符串的答案工作。你可以輕鬆地運行:

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

絕對正確。 – 2015-01-04 19:01:43

+4

這是「正確的答案」,應該被接受而不是另一個。 – 2015-04-26 23:22:29

+0

作品像一個魅力 – Hammer 2015-07-03 07:37:56

29

我想你可以試試這個:

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爲一個忽略證書錯誤的選項

感謝Ross指出這一點。

+0

如果這是發佈,將工作,但不幸的是參數必須通過GET傳遞爲url變量。 – DeaconDesperado 2012-02-01 17:28:06

+4

你嘗試過'-G'開關嗎? – Nishant 2012-02-01 17:31:03

+1

甚至在你的情況下(如有問題),你嘗試用雙引號查詢字符串圍繞你的網址嗎? – Nishant 2012-02-01 17:33:12

相關問題