Mengapa curl memotong string kueri ini?

90

Saya yakin jawaban untuk ini adalah masalah pengkodean karakter yang sangat jelas ...

Saya menggunakan curl pada baris perintah untuk menguji beberapa titik akhir di aplikasi python. Titik akhir mengambil parameter url lintang dan bujur. Tidak ada yang terlalu istimewa. Saya memasukkan perintah:

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

Server merespons, dengan keluaran curl verbose:

* 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

Pada baris kedua dari dump itu, jelas bahwa parameter kedua lon,, tidak terkirim. Apa yang saya lakukan salah? Terima kasih.

DeaconDesperado
sumber
1
Mungkin tidak terkait dengan pertanyaan awal, tetapi jika saya kehilangan bagian dari string kueri, saya akan mengembalikan 400 atau yang lain, bukan 500.
Michael Munsey

Jawaban:

246

Jawaban atas pertanyaan, "apa yang saya lakukan salah," adalah bahwa shell melihat ampersand ( &) dan berpikir bahwa itu adalah akhir dari perintah (dan meletakkannya di latar belakang). Anda perlu mengutipnya, itulah mengapa jawaban yang mengutip string itu berhasil. Anda dapat dengan mudah menjalankan ini:

curl -v -L "http://localhost:5000/pulse?lat=41.225&lon=-73.1"
Bob Kimble
sumber
Saya telah mencobanya pada gitbash di bawah jendela tanpa banyak keberhasilan
avi.elkharrat
35

Saya pikir Anda bisa mencoba ini:

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

secara default, ini memanggil POST. Jika Anda ingin mengirim permintaan GET

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

Lebih banyak ...
dan karena Anda menggunakan localhost, jika Anda akan menggunakan https, Anda mungkin ingin menyertakan -ksebagai opsi untuk mengabaikan kesalahan sertifikat

Terima kasih kepada Ross karena telah menunjukkan ini.

Nishant
sumber
Akan berfungsi jika ini adalah posting, tetapi sayangnya params harus diteruskan sebagai variabel url melalui GET.
DeaconDesperado
4
Apakah Anda mencoba -Gberalih?
Nishant
1
bahkan dalam kasus Anda (seperti yang dipertanyakan) apakah Anda mencoba mengapit URL Anda dengan string kueri dengan tanda kutip ganda?
Nishant
dan karena Anda menggunakan localhost, jika Anda menggunakan https, Anda mungkin ingin menyertakan -k sebagai opsi untuk mengabaikan kesalahan sertifikat.
Ross
Tak satu pun dari metode itu berhasil untuk saya. Melewati sebuah string dan itu selalu menjadi kosong. Mengirim ke server Grizzly.
pengguna3217883