เหตุใด curl จึงตัดสตริงข้อความค้นหานี้


92

ฉันแน่ใจว่าคำตอบนี้จะเป็นปัญหาการเข้ารหัสอักขระที่ชัดเจนอย่างเจ็บปวด ...

ฉันใช้ curl บนบรรทัดคำสั่งเพื่อทดสอบจุดสิ้นสุดบางส่วนในแอป python จุดสิ้นสุดรับ url params ของละติจูดและลองจิจูด ไม่มีอะไรพิเศษเกินไป ฉันใส่คำสั่ง:

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

เซิร์ฟเวอร์ตอบสนองพร้อมเอาต์พุตแบบ verbose 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จะไม่ถูกส่ง ผมทำอะไรผิดหรือเปล่า? ขอบคุณ.


1
อาจไม่เกี่ยวข้องกับคำถามเดิม แต่ถ้าฉันขาดบางส่วนของสตริงการสืบค้นฉันจะส่งคืน 400 หรืออย่างอื่นไม่ใช่ 500
Michael Munsey

คำตอบ:


247

คำตอบสำหรับคำถาม "ฉันทำอะไรผิด" คือเชลล์เห็นเครื่องหมายและ ( &) และคิดว่านั่นคือจุดสิ้นสุดของคำสั่ง (และวางไว้ในพื้นหลัง) คุณจำเป็นต้องอ้างมันซึ่งเป็นเหตุผลว่าทำไมคำตอบที่อ้างถึงการทำงานของสตริง คุณสามารถเรียกใช้สิ่งนี้ได้อย่างง่ายดาย:

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

ฉันได้ลองใช้ gitbash ภายใต้ windows โดยไม่ประสบความสำเร็จมากนัก
avi.elkharrat

36

ฉันคิดว่าคุณสามารถลองสิ่งนี้:

 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ไว้เป็นตัวเลือกเพื่อละเว้นข้อผิดพลาดของใบรับรอง

ขอบคุณรอสที่ชี้เรื่องนี้


จะใช้งานได้ถ้าเป็นโพสต์ แต่น่าเสียดายที่ต้องส่ง params เป็นตัวแปร url ผ่าน GET
DeaconDesperado

1
แม้ในกรณีของคุณ (ตามที่เป็นปัญหา) คุณได้ลองใช้สตริงคำค้นหาที่มีเครื่องหมายอัญประกาศคู่หรือไม่
Nishant

และเนื่องจากคุณใช้ localhost หากคุณต้องการใช้ https คุณอาจต้องการรวม -k เป็นตัวเลือกเพื่อละเว้นข้อผิดพลาดของใบรับรอง
รอส

วิธีการเหล่านี้ไม่ได้ผลสำหรับฉัน ผ่านสตริงแล้วมันจะว่างเปล่าเสมอ กำลังส่งไปยังเซิร์ฟเวอร์ Grizzly
user3217883
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.