为什么curl要截断这个查询字符串?

为什么curl要截断这个查询字符串?,curl,urlencode,Curl,Urlencode,我相信这个问题的答案将是一些非常明显的字符编码问题 我在命令行上使用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 HT

我相信这个问题的答案将是一些非常明显的字符编码问题

我在命令行上使用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
*连接到本地主机(127.0.0.1)端口5000(#0)
>GET/pulse/?lat=41.225 HTTP/1.1
>用户代理: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
>主机:本地主机:5000
>接受:*/*
> 
*HTTP 1.0,假设在正文之后关闭

在转储的第二行,很明显第二个参数,
lon
,没有被发送。我做错了什么?谢谢。

我想你可以试试这个:

 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
作为忽略证书错误的选项


感谢您指出这一点。

问题“我做错了什么”的答案是shell看到了符号(
&
),并认为这是命令的结束(并将其放在后台)。你需要引用它,这就是为什么引用字符串的答案是有效的。您也可以轻松地运行以下操作:

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

如果这是post,则会起作用,但不幸的是,参数必须作为url变量通过GET传递。即使在您的情况下(如所述),您是否尝试使用带有双引号的查询字符串围绕url?而且由于您使用的是localhost,如果要使用https,您可能希望包含-k作为忽略证书错误的选项。这些方法都不适合我。传递字符串时,它总是显示为空白。发送到Grizzly服务器。可能与原始问题无关,但如果我缺少查询字符串的一部分,我将返回400或其他值,而不是500。我在windows下的gitbash上尝试过,但没有太大成功