Curl bu sorgu dizesini neden kesiyor?


92

Eminim bu sorunun cevabı acı verici derecede bariz bir karakter kodlama sorunu olacaktır ...

Bir python uygulamasında bazı uç noktaları test etmek için komut satırında curl kullanıyorum. Uç nokta, enlem ve boylam url parametrelerini alır. Çok özel bir şey yok. Komutu verdim:

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

Sunucu, ayrıntılı curl çıktısıyla yanıt verir:

* 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

Bu dökümün ikinci satırında, ikinci parametrenin longönderilmediği açıktır . Neyi yanlış yapıyorum? Teşekkürler.


1
Muhtemelen orijinal soruyla ilgisizdir, ancak sorgu dizesinin bir kısmını
Michael Munsey

Yanıtlar:


247

"Neyi yanlış yapıyorum" sorusunun cevabı, kabuğun "ve" işaretini ( &) görmesi ve bunun komutun sonu olduğunu düşünmesidir (ve arka plana koymasıdır). Alıntı yapmanız gerekir, bu yüzden dizeyi alıntılayan cevaplar çalışır. Bunu da kolayca çalıştırabilirsiniz:

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

Bunu gitbash üzerinde çok başarılı olmadan pencerelerin altında
deniyorum

36

Sanırım şunu deneyebilirsin:

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

varsayılan olarak bu POST'u çağırır. GET isteği göndermek istiyorsanız

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

Daha fazlası ...
ve kullandığınızdan beri localhost, kullanacak httpsolsaydınız, muhtemelen -ksertifika hatalarını yok saymak için bir seçenek eklemek istersiniz.

Ross'a bunu işaret ettiği için teşekkürler .


Bu post olsaydı işe yarar, ancak maalesef parametrelerin GET üzerinden url değişkenleri olarak geçirilmesi gerekir.
DeaconDesperado

1
sizin durumunuzda bile (söz konusu olduğunda) URL'nizi çift tırnak içine alan sorgu dizesi ile çevrelemeye çalıştınız mı?
Nishant

ve localhost kullandığınız için, https kullanacak olsaydınız, sertifika hatalarını yok saymak için muhtemelen -k seçeneğini eklemek istersiniz.
Ross

Bu yöntemlerin hiçbiri benim için işe yaramıyor. Bir dizge geçmek ve her zaman boş olarak gelir. Grizzly sunucusuna gönderiliyor.
user3217883
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.