为什么curl会截断该查询字符串?


89

我敢肯定这个问题的答案将是一些痛苦而显而易见的字符编码问题...

我在命令行上使用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
迈克尔Munsey

Answers:


244

问题“我在做什么错”的答案是,外壳程序看到了&符(&),并认为这是命令的结尾(并将其置于后台)。您需要引用它,这就是引用字符串的答案起作用的原因。您可以轻松地运行此命令:

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

我一直在Windows下的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为忽略证书错误的选项

感谢Ross指出这一点。


如果发布,则可以使用,但不幸的是,必须将这些参数作为GET上的url变量传递。
DeaconDesperado

4
您尝试过-G切换吗?
Nishant

1
即使在您的情况下(有问题),您是否也尝试用双引号将查询字符串括在URL中?
Nishant

并且由于您使用的是localhost,因此如果要使用https,则可能需要包含-k作为忽略证书错误的选项。
罗斯

这些方法都不适合我。传递一个字符串,它总是以空白结束。发送到Grizzly服务器。
user3217883
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.