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

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

我在命令行中使用 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没有被发送。我做错了什么?谢谢。

86371 次浏览

I think you can try this:

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

by default, this calls POST. If you want to send a GET request

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

More...
and since you're using localhost, if you were to use https, you'd probably want to include -k as an option to ignore certificate errors

Thanks to Ross for pointing this.

The answer to the question, "what am I doing wrong," is that the shell sees the ampersand (&) and thinks that's the end of the command (and puts it into the background). You need to quote it, which is why the answers that quoted the string work. You could just as easily run this:

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