curlがこのクエリ文字列を切り捨てるのはなぜですか?


90

これに対する答えは、痛々しいほど明白な文字エンコードの問題になると確信しています...

コマンドラインで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

そのダンプの2行目では、2番目のパラメータ、lonが送信されていないことは明らかです。私は何が間違っているのですか?ありがとう。


1
おそらく、元の質問とは関係のない、しかし、私は、クエリ文字列の一部が欠落していた場合、私は500、400または何か他のものではなく返します
マイケルMunsey

回答:


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証明書エラーを無視するオプションとして、

これを指摘してくれたRossに感謝します。


これが投稿された場​​合は機能しますが、残念ながら、パラメータはGETを介してURL変数として渡す必要があります。
DeaconDesperado 2012

4
-G切り替えてみましたか?
ニシャント2012

1
あなたの場合でも(問題のように)、URLを二重引用符で囲んだクエリ文字列で囲んでみましたか?
ニシャント2012

また、localhostを使用しているため、httpsを使用する場合は、証明書エラーを無視するオプションとして-kを含めることをお勧めします。
ロス

それらの方法はどれも私にはうまくいきません。文字列を渡すと、常に空白として表示されます。Grizzlyサーバーに送信しています。
user3217883 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.