Curl รับคำขอด้วยพารามิเตอร์ json


124

ฉันกำลังพยายามส่งคำขอ "GET" ไปยัง REST API ระยะไกลจาก Command Prompt ผ่าน cURL ดังนี้:

curl -X GET -H "Content-type: application/json" -H "Accept: application/json"  "http://server:5050/a/c/getName/{"param0":"pradeep"}"

แต่กลับไม่มีผลลัพธ์ ฉันพยายาม ping URL โดยตรงจากเบราว์เซอร์ฉันสามารถรับคำตอบได้สำเร็จฉันไม่เข้าใจว่าคำสั่งมีอะไรผิดปกติ

โดยทั่วไปฉันต้องการตั้งค่าการร้องขอ "GET" ไปยังบริการ REST ระยะไกลซึ่งให้ข้อมูล json แก่ฉันเป็นการตอบสนองผ่าน curl ใครช่วยชี้แนะหน่อยว่าฉันทำผิดอะไร ฉันลองโพสต์ต่างๆ แต่ทั้งหมดพูดถึงคำขอ POST ที่ไม่เกี่ยวกับ GET


มีข้อผิดพลาดอะไรบ้างที่ถูกโพสต์บนฝั่งเซิร์ฟเวอร์ของคุณ?
Scary Wombat

ไม่มีข้อผิดพลาดฝั่งเซิร์ฟเวอร์กำลังดำเนินการสำเร็จ แต่จากด้าน curl จะไม่แสดงข้อมูลใด ๆ เพียงแค่ส่ง Ping หลังจากนั้นไม่กี่วินาทีมันก็แสดงว่างเปล่าโดยไม่มีข้อมูล
ประดิษฐสีมา

ลองใช้ curl -i -H "Accept: application / json" " server: 5050 / a / c / getName {" param0 ":" pradeep "}" ได้ไหม (ตัวเลือก -i แทน x)
Harshal Bulsara

คำตอบ:


139

สิ่งนี้ควรใช้งานได้:

  curl -i -H "Accept: application/json" 'server:5050/a/c/getName{"param0":"pradeep"}'

ใช้ตัวเลือก -i แทน x


4
ใบเสนอราคาอาจแตกต่างกัน? "server: 5050 / a / c / getName {'param0': 'pradeep'}"
AB

มันควรจะเป็นอย่างใดอย่างหนึ่ง'server:5050/a/c/getName{"param0":"pradeep"}'หรือ"server:5050/a/c/getName{\"param0\":\"pradeep\"}".
Benjamin W.

16

หากคุณต้องการที่จะส่งข้อมูลของคุณภายในร่างกายแล้วคุณจะต้องทำPOSTหรือแทนPUTGET

สำหรับผมมันดูเหมือนว่าคุณกำลังพยายามที่จะส่งแบบสอบถามกับพารามิเตอร์ URIซึ่งไม่ได้เกี่ยวข้องกับการGETที่คุณยังสามารถใส่พารามิเตอร์เหล่านี้บนPOST, PUTและอื่น ๆ

แบบสอบถามเป็นส่วนที่เป็นทางเลือกคั่นด้วยเครื่องหมายคำถาม ("?") ซึ่งมีข้อมูลการระบุตัวตนเพิ่มเติมที่ไม่ได้มีลักษณะเป็นลำดับชั้น ไวยากรณ์ของสตริงการสืบค้นไม่ได้กำหนดโดยทั่วไป แต่โดยทั่วไปจะจัดเป็นลำดับของ = คู่โดยที่คู่คั่นด้วยอัฒภาคหรือเครื่องหมายแอมเพอร์แซนด์

ตัวอย่างเช่น:

curl http://server:5050/a/c/getName?param0=foo&param1=bar

7
ข้อความคำขอ HTTP ใด ๆ ได้รับอนุญาตให้มีเนื้อหาของข้อความ ไม่มีประโยชน์สำหรับ GET เนื่องจาก GET semantics - เนื้อหาของเนื้อหาคำขอถ้ามีไม่ควรเปลี่ยนการตอบสนอง
Jarek Przygódzki

12

หากคุณต้องการส่งคำขอ GET ด้วย JSON ในเนื้อหาจริงๆ (พูดสำหรับคำขอ XHR และคุณทราบว่าเซิร์ฟเวอร์รองรับการประมวลผลเนื้อหาในคำขอ GET) คุณสามารถ:

curl -X GET \
  -H "Content-type: application/json" \
  -H "Accept: application/json" \
  -d '{"param0":"pradeep"}' \
  "http://server:5050/a/c/getName"

เว็บเซิร์ฟเวอร์ที่ทันสมัยส่วนใหญ่ยอมรับคำขอประเภทนี้


สิ่งนี้ไม่ได้ผลตามที่ตั้งใจไว้ การใช้httpbin.org/getสำหรับการดีบักผลตอบแทนนี้: { "args": {}, "headers": { "Accept": "application/json", "Content-Length": "20", "Content-Type": "application/json", "Host": "httpbin.org", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:57.0) Gecko/20100101 Firefox/57.0" }, "origin": "27.94.235.50, 27.94.235.50", "url": "https://httpbin.org/get" }ไม่มีสิ่งใดได้รับ คุณต้องใช้สตริงข้อความค้นหาเช่นcurl -X GET https://httpbin.org/get?data=%7B%22param0%22%3A%22pradeep%22%7D
Jacques

ขึ้นอยู่กับว่าเว็บเซิร์ฟเวอร์ของคุณกำลังตรวจสอบเนื้อหาสำหรับคำขอ GET หรือไม่ซึ่งฉันยอมรับว่าไม่ใช่พฤติกรรมมาตรฐานทั้งหมด คุณอาจจะดีกว่าการใช้พารามิเตอร์การค้นหา url เหมือนที่คุณพูด ปัญหาหนึ่งในการใช้เนื้อหาในคำขอรับคือเบราว์เซอร์ไม่สามารถเล่นคำขอซ้ำได้โดยการนำทางด้วยประวัติของเบราว์เซอร์แม้ว่าจะใช้ได้ดีสำหรับคำขอ XHR
Steven Soroka

อีกวิธีหนึ่งที่สามารถทำได้หากมีการควบคุมทางฝั่งเซิร์ฟเวอร์เพียงพอคือเพิ่มคุณสมบัติพิเศษในข้อมูล json เช่น "method": "get" ส่ง payload ใน post request และให้ code บนเซิร์ฟเวอร์ตีความสิ่งนี้ ตามคำขอ
Jacques

@ Jacques แน่นอน แต่ถ้าคุณมีการควบคุมเซิร์ฟเวอร์คุณสามารถให้เซิร์ฟเวอร์ของคุณอ่านเนื้อหาของคำขอ GET ได้อย่างง่ายดาย กลับไปที่คำถามเดิมฉันคิดว่าแทนเจนต์ทั้งหมดนี้ไม่ตรงประเด็น อ่านคำถามซ้ำไม่คิดว่า OP จะเข้าเปลี่ยนเซิฟเวอร์ได้
Steven Soroka

ใช่นั่นเป็นความจริง หากคุณควบคุมเซิร์ฟเวอร์ ความคิดเห็นของฉันได้รับการกระตุ้นโดยคำสั่งต่อไปนี้ที่คุณกล่าวไว้ซึ่งอย่างที่ฉันพูดไปจะไม่ให้ผลลัพธ์ที่ตั้งใจไว้: "เว็บเซิร์ฟเวอร์ที่ทันสมัยส่วนใหญ่ยอมรับคำขอประเภทนี้" ตามความเป็นจริงพวกเขาจะยอมรับคำขอที่คุณอธิบายไว้ แต่คำขอนั้นจะไม่ได้ผลลัพธ์ที่ตั้งใจไว้ หรือคุณอาจต้องการแก้ไขข้อความเช่นนี้: "เว็บเซิร์ฟเวอร์ที่ทันสมัยส่วนใหญ่ยอมรับคำขอประเภทนี้โดยสมมติว่าคุณมีอำนาจควบคุมโดยตรงบนฝั่งเซิร์ฟเวอร์ แต่สิ่งนี้ไม่ได้มาตรฐาน"
Jacques

8

GET รับคู่ค่าชื่อ

ลองสิ่งที่ชอบ:

curl http://server:5050/a/c/getName/?param1=pradeep

หรือ

curl http://server:5050/a/c/getName?param1=pradeep

btw REST ปกติควรมีลักษณะดังนี้

curl http://server:5050/a/c/getName/pradeep หากใช้ JSON ใน GET URL ไม่ใช่วิธีมาตรฐาน


4

สำหรับบริการป้องกันด้วยชื่อผู้ใช้และรหัสผ่านให้ใช้ดังต่อไปนี้

curl -u admin:password -X GET http://172.16.2.125:9200 -d '{"sort":[{"lastUpdateTime":{"order":"desc"}}]}'

curl -X POST -H "Content-type: application / json" -d '{"stuff": "things"}' http: // ...
keithpjolley

แก้ไขฉันถ้าฉันผิด แต่การมี -d ในคำขอ curl (และไม่ระบุวิธีการ) จะทำให้คำขอเป็น POST
Gokigooooks

3

ลอง

curl -G ...

แทน

curl -X GET ...

โดยปกติคุณไม่ต้องการตัวเลือกนี้ คำขอ GET, HEAD, POST และ PUT ทุกประเภทค่อนข้างถูกเรียกใช้โดยใช้ตัวเลือกบรรทัดคำสั่งเฉพาะ

ตัวเลือกนี้จะเปลี่ยนเฉพาะคำจริงที่ใช้ในคำขอ HTTP โดยจะไม่เปลี่ยนวิธีการทำงานของ curl ตัวอย่างเช่นหากคุณต้องการร้องขอ HEAD ที่เหมาะสมการใช้ -X HEAD จะไม่เพียงพอ คุณต้องใช้ตัวเลือก -I, --head


1

วิธีแก้ปัญหาดังกล่าวข้างต้นไม่ได้ผลสำหรับฉันเนื่องจากเหตุผลบางประการ นี่คือทางออกของฉัน มันค่อนข้างธรรมดา

curl -X GET API_ENDPOINT -H 'ประเภทเนื้อหา: application / json' -d ' JSON_DATA '

API_ENDPOINTคือจุดสิ้นสุด api ของคุณเช่น: http://127.0.0.1:80/api

-Hถูกใช้เพื่อเพิ่มเนื้อหาส่วนหัว

JSON_DATAคือเนื้อหาคำขอของคุณซึ่งอาจเป็นอะไรก็ได้เช่น :: {"data_key": "value"} '' JSON_DATA โดยรอบมีความสำคัญ

อะไรหลังจาก-dเป็นข้อมูลที่คุณจำเป็นต้องส่งในคำขอการ GET

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