ฉันจะโพสต์ข้อมูล JSON ด้วย cURL ได้อย่างไร


2830

ฉันใช้ Ubuntu และติดตั้งcURLกับมัน ฉันต้องการทดสอบแอปพลิเคชัน Spring REST ด้วย cURL ฉันเขียนรหัส POST ของฉันที่ฝั่ง Java อย่างไรก็ตามฉันต้องการทดสอบด้วย cURL ฉันพยายามโพสต์ข้อมูล JSON ข้อมูลตัวอย่างเป็นดังนี้:

{"value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true}

ฉันใช้คำสั่งนี้:

curl -i \
    -H "Accept: application/json" \
    -H "X-HTTP-Method-Override: PUT" \
    -X POST -d "value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true \
    http://localhost:8080/xx/xxx/xxxx

มันกลับข้อผิดพลาดนี้:

HTTP/1.1 415 Unsupported Media Type
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 1051
Date: Wed, 24 Aug 2011 08:50:17 GMT

คำอธิบายข้อผิดพลาดคือ:

เซิร์ฟเวอร์ปฏิเสธคำขอนี้เนื่องจากเอนทิตีคำขออยู่ในรูปแบบที่ไม่สนับสนุนทรัพยากรที่ร้องขอสำหรับวิธีการที่ร้องขอ ()

Tomcat log: "POST / ui / webapp / conf / clear HTTP / 1.1" 415 1051

รูปแบบที่ถูกต้องของคำสั่ง cURL คืออะไร

นี่คือPUTโค้ดด้าน Java ของฉัน(ฉันได้ทดสอบ GET และ DELETE แล้วและมันใช้ได้)

@RequestMapping(method = RequestMethod.PUT)
public Configuration updateConfiguration(HttpServletResponse response, @RequestBody Configuration configuration) { //consider @Valid tag
    configuration.setName("PUT worked");
    //todo If error occurs response.sendError(HttpServletResponse.SC_NOT_FOUND);
    return configuration;
}

6
ชำระเงินลิงค์สำหรับฤดูใบไม้ผลิคำขอโพสต์ 3.2.0
AmirHd

8
มีโพสต์ที่ดีใช้ Curl สำหรับการทดสอบเฉพาะกิจของ Microservices RESTfulซึ่งครอบคลุมสิ่งนี้ด้วยตัวอย่างมากมาย
upitau

คำตอบ:


4340

คุณต้องกำหนดประเภทเนื้อหาเป็น application / json แต่-dส่ง Content-Type application/x-www-form-urlencodedซึ่งไม่ได้รับการยอมรับจากฝั่งของสปริง

ดูที่หน้าคนขดผมคิดว่าคุณสามารถใช้-H:

-H "Content-Type: application/json"

ตัวอย่างเต็มรูปแบบ:

curl --header "Content-Type: application/json" \
  --request POST \
  --data '{"username":"xyz","password":"xyz"}' \
  http://localhost:3000/api/login

( -Hสั้นสำหรับ--header, -dสำหรับ--data)

โปรดทราบว่า-request POSTเป็นตัวเลือกหากคุณใช้-dเนื่องจากการ-dตั้งค่าสถานะหมายถึงคำขอ POST


ใน Windows สิ่งต่าง ๆ เล็กน้อย ดูกระทู้ความคิดเห็น


262
สำหรับ windows เครื่องหมายคำพูดเดี่ยวรอบ json ไม่ได้ผลและฉันสิ้นสุดการหลบหนีอัญประกาศคู่ curl -X POST -H "Content-Type: application/json" -d "{ \"key1\": \"value1\" }" http://localhost:3000/api/method
hIpPy

37
สำหรับฉันใน Windows ฉันจำเป็นต้องหลีกเลี่ยงการใช้เครื่องหมายคำพูดในรูปแบบ"{ """key1""": """value1""" }"นี้ นอกจากนี้คำตอบนี้: stackoverflow.com/questions/18314796/ …
chodorowicz

4
@chodorowicz มันแย่มาก! ฉันรู้ว่าไวยากรณ์จาก VB!
ฌอนแพทริคฟลอยด์

3
ฉันมีปัญหาเกี่ยวกับคำขอ POST แต่แก้ไขโดยใช้ตัวพิมพ์ใหญ่ "Application / json" ดังนั้นหากคุณพบข้อผิดพลาด 415 ให้ตรวจสอบตัวพิมพ์ใหญ่
WiteCastle

5
@ostrokach ขอโทษที่ทำให้คุณเสียเวลา ไวยากรณ์ใช้งานได้ดีสำหรับฉันใน OSX เมื่อฉันโพสต์ไว้ (ยังไม่ได้ลองใหม่) คิดว่ามันเป็น / เป็นเพียงความแตกต่างของแพลตฟอร์ม ฉันคิดว่า upvotes มาจากคนที่ช่วย
Adam Tuttle

564

ลองใส่ข้อมูลของคุณในไฟล์พูดbody.jsonแล้วใช้

curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf

12
คุณอาจจะใช้ตัวเลือกแทน--data-binary --dataหนึ่งคาดว่าลูกค้าจะส่งข้อมูลตามที่เป็นอยู่ แต่จะแยก--dataCR und LF ออกจากอินพุต
h2stein

14
การใช้ cUrl กับอินไลน์ json Strings ดูเหมือนจะเป็นฝันร้าย ไม่จำเป็นต้องมองข้ามอักขระเครื่องหมายคำพูดคู่ ไปกับไฟล์แบบนี้ดีกว่า
Xtreme Biker

46
สิ่งสำคัญคือการเพิ่ม@อักขระก่อนชื่อไฟล์มิฉะนั้นจะใช้งานไม่ได้ ฉันใช้เวลาเพียง 20 นาทีในการตบหัวตัวฉันที่อึนี้ ...
Radu Murzea

3
วิธีนี้คุณสามารถรันจอน JSON บนไฟล์เพื่อดูว่ามีข้อผิดพลาดในการวิเคราะห์ JSON หรือไม่
datashaman

4
ใน Windows คุณต้องใส่เครื่องหมายคำพูดคู่ล้อมรอบชื่อไฟล์ "@ body.json"
Stomf

100

คุณอาจพบว่ามีประโยชน์สำหรับการพักผ่อน: https://github.com/micha/resty

เป็น wrapper round CURL ซึ่งช่วยให้คำขอ REST ของบรรทัดคำสั่งง่ายขึ้น คุณชี้ไปที่จุดสิ้นสุด API ของคุณและให้คำสั่ง PUT และ POST แก่คุณ (ตัวอย่างดัดแปลงมาจากหน้าแรก)

$ resty http://127.0.0.1:8080/data #Sets up resty to point at your endpoing
$ GET /blogs.json                  #Gets http://127.0.0.1:8080/data/blogs.json
                                   #Put JSON
$ PUT /blogs/2.json '{"id" : 2, "title" : "updated post", "body" : "This is the new."}'
                                   # POST JSON from a file
$ POST /blogs/5.json < /tmp/blog.json

นอกจากนี้ยังจำเป็นต้องเพิ่มส่วนหัวของประเภทเนื้อหา คุณสามารถทำได้เพียงครั้งเดียวในการตั้งค่าเริ่มต้นเพิ่มไฟล์กำหนดค่าสำหรับแต่ละวิธี: การตั้งค่าตัวเลือก RESTY เริ่มต้น


93

สำหรับ Windows การใช้เครื่องหมายคำพูดเดี่ยวสำหรับ-dค่าไม่ได้ผลสำหรับฉัน แต่มันได้ผลหลังจากเปลี่ยนเป็นอัญประกาศคู่ นอกจากนี้ฉันต้องหลบหนีเครื่องหมายคำพูดคู่ภายในวงเล็บปีกกา

นั่นคือสิ่งต่อไปนี้ใช้งานไม่ได้:

curl -i -X POST -H "Content-Type: application/json" -d '{"key":"val"}' http://localhost:8080/appname/path

แต่งานต่อไปนี้:

curl -i -X POST -H "Content-Type: application/json" -d "{\"key\":\"val\"}" http://localhost:8080/appname/path

5
FYI - ดูเหมือนว่าคุณไม่มีเครื่องหมายอัญประกาศปิดรอบตัว json
acanby

3
สำหรับฉันบน Windows การ "รอบ ๆ ข้อมูลไม่ทำงานไม่มีเครื่องหมายอัญประกาศแทน
rodedo

3
หากคุณกำลังใช้ PowerShell ดูนี้คำตอบ
rsenna

86

มันใช้งานได้สำหรับฉันโดยใช้:

curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":100}' http://localhost/api/postJsonReader.do

มันถูกแมปอย่างมีความสุขกับตัวควบคุมสปริง:

@RequestMapping(value = "/postJsonReader", method = RequestMethod.POST)
public @ResponseBody String processPostJsonData(@RequestBody IdOnly idOnly) throws Exception {
        logger.debug("JsonReaderController hit! Reading JSON data!"+idOnly.getId());
        return "JSON Received";
}

IdOnlyเป็นPOJOง่าย ๆพร้อมด้วยคุณสมบัติ id


56

ตัวอย่างเช่นสร้างไฟล์ JSON, params.json และเพิ่มเนื้อหานี้:

[
    {
        "environment": "Devel",
        "description": "Machine for test, please do not delete!"
    }
]

จากนั้นคุณเรียกใช้คำสั่งนี้:

curl -v -H "Content-Type: application/json" -X POST --data @params.json -u your_username:your_password http://localhost:8000/env/add_server



31

คุณสามารถใช้บุรุษไปรษณีย์กับ GUI ที่ใช้งานง่ายเพื่อรวบรวมcURLคำสั่งของคุณ

  1. ติดตั้งและเริ่มบุรุษไปรษณีย์
  2. พิมพ์ URL ของคุณโพสต์เนื้อหาขอส่วนหัว ฯลฯ pp
  3. คลิกที่ Code
  4. เลือก cURLจากรายการแบบหล่นลง
  5. คัดลอกและวางcURLคำสั่งของคุณ

หมายเหตุ: มีหลายตัวเลือกสำหรับการสร้างคำขออัตโนมัติในรายการแบบหล่นลงซึ่งเป็นสาเหตุที่ฉันคิดว่าโพสต์ของฉันเป็นสิ่งจำเป็นในตอนแรก


6
ไม่ทราบว่ามีฟีเจอร์ดังกล่าวรวมอยู่ในบุรุษไปรษณีย์ ขอบคุณที่ชี้นำ!
ariestav

29

ใช้ CURL Windows ลองนี้:

curl -X POST -H "Content-Type:application/json" -d "{\"firstName\": \"blablabla\",\"lastName\": \"dummy\",\"id\": \"123456\"}" http-host/_ah/api/employeeendpoint/v1/employee

28

คุณสามารถใช้บุรุษไปรษณีย์เพื่อแปลงเป็น CURLป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่


1
ขอบคุณมาก @ ตลอดไป - LA มันเป็นเคล็ดลับช่วยชีวิตสำหรับฉัน
45417

24

HTTPieเป็นทางเลือกที่แนะนำcurlเนื่องจากคุณสามารถทำได้

$ http POST http://example.com/some/endpoint name=value name1=value1

มันพูด JSON โดยค่าเริ่มต้นและจะจัดการทั้งการตั้งค่าส่วนหัวที่จำเป็นสำหรับคุณเช่นเดียวกับการเข้ารหัสข้อมูลเป็น JSON ที่ถูกต้อง นอกจากนี้ยังมี:

Some-Header:value

สำหรับส่วนหัวและ

name==value

สำหรับพารามิเตอร์สตริงแบบสอบถาม หากคุณมีข้อมูลจำนวนมากคุณสามารถอ่านจากไฟล์ที่มีการเข้ารหัส JSON:

 field=@file.txt

20

หากคุณกำลังทดสอบการส่ง / ตอบสนอง JSON จำนวนมากกับอินเทอร์เฟซ RESTful คุณอาจต้องการตรวจสอบปลั๊กอินPostmanสำหรับ Chrome (ซึ่งช่วยให้คุณกำหนดการทดสอบบริการเว็บด้วยตนเอง) และคำสั่งNewman ที่ใช้ Node.js -line สหาย (ซึ่งช่วยให้คุณทำการทดสอบโดยอัตโนมัติกับ "คอลเลกชัน" ของการทดสอบบุรุษไปรษณีย์) ทั้งฟรีและเปิด!


18

สิ่งนี้ทำงานได้ดีสำหรับฉันนอกจากนี้การใช้การรับรองความถูกต้องพื้นฐาน:

curl -v --proxy '' --basic -u Administrator:password -X POST -H "Content-Type: application/json"
        --data-binary '{"value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true}'
        http://httpbin.org/post

แน่นอนคุณไม่ควรใช้การรับรองความถูกต้องเบื้องต้นโดยไม่มี SSL และใบรับรองที่ตรวจสอบ

ฉันวิ่งเข้าไปหาสิ่งนี้อีกครั้งในวันนี้โดยใช้ cURL 7.49.1 สำหรับ Windows ของ Cygwin ... และเมื่อใช้--dataหรือ--data-binaryด้วยอาร์กิวเมนต์ JSON, cURL สับสนและจะตีความ{}ใน JSON เป็นเทมเพลต URL กำลังเพิ่ม-gอาร์กิวเมนต์เพื่อปิด cURL ทำให้กลมกลืนแก้ไข

ดูเพิ่มเติมที่การส่ง URL ด้วยเครื่องหมายวงเล็บเพื่อให้ม้วนงอ


17

คุณสามารถใส่เนื้อหา JSON ของคุณลงในไฟล์และส่งต่อไปยัง curl โดยใช้--file-uploadตัวเลือกผ่านอินพุตมาตรฐานเช่นนี้

 echo 'my.awesome.json.function({"do" : "whatever"})' | curl -X POST "http://url" -T -


10

ฉันใช้รูปแบบด้านล่างเพื่อทดสอบกับเว็บเซิร์ฟเวอร์

use -F 'json data'

สมมติว่ารูปแบบ JSON dict นี้:

{
    'comment': {
        'who':'some_one',
        'desc' : 'get it'
    }
}

ตัวอย่างเต็ม

curl -XPOST your_address/api -F comment='{"who":"some_one", "desc":"get it"}'

6

ใช้ตัวเลือก -d เพื่อเพิ่มน้ำหนักบรรทุก

curl -X POST \
http://<host>:<port>/<path> \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"foo": "bar",
"lorem": "ipsum"
}'

นอกจากนี้:

ใช้ -X POST เพื่อใช้วิธี POST

ใช้ -H 'ยอมรับ: application / json' เพื่อเพิ่มส่วนหัวของ accept type

ใช้ -H 'Content-Type: application / json' เพื่อเพิ่มหัวข้อประเภทเนื้อหา


ฉันพยายามใช้ แต่ได้รับข้อผิดพลาด {"ข้อผิดพลาด": ["ไม่มีข้อมูลที่ให้"]}
Suresh

6

สิ่งนี้ใช้ได้กับฉันใน Windows10

curl -d "{"""owner""":"""sasdasdasdasd"""}" -H "Content-Type: application/json" -X  PUT http://localhost:8080/api/changeowner/CAR4

5

กรุณาตรวจสอบเครื่องมือนี้ มันช่วยให้คุณสร้างเกร็ดเล็กเกร็ดน้อยได้อย่างง่ายดาย

curl -XGET -H "Accept: application/json" -d "{\"value\":\"30\",\"type\":\"Tip 3\",\"targetModule\":\"Target 3\",\"configurationGroup\":null,\"name\":\"Configuration Deneme 3\",\"description\":null,\"identity\":\"Configuration Deneme 3\",\"version\":0,\"systemId\":3,\"active\":true}" "http://localhost:8080/xx/xxx/xxxx"

5

นี่เป็นอีกวิธีในการทำหากคุณมีข้อมูลแบบไดนามิกที่จะรวม

#!/bin/bash

version=$1
text=$2
branch=$(git rev-parse --abbrev-ref HEAD)
repo_full_name=$(git config --get remote.origin.url | sed 's/.*:\/\/github.com\///;s/.git$//')
token=$(git config --global github.token)

generate_post_data()
{
  cat <<EOF
{
  "tag_name": "$version",
  "target_commitish": "$branch",
  "name": "$version",
  "body": "$text",
  "draft": false,
  "prerelease": false
}
EOF
}

echo "Create release $version for repo: $repo_full_name branch: $branch"
curl --data "$(generate_post_data)" "https://api.github.com/repos/$repo_full_name/releases?access_token=$token"

1
คุณช่วยชีวิตฉัน!
Abhimanyu

4

ฉันรู้ว่ามีผู้ตอบคำถามนี้จำนวนมาก แต่ต้องการแบ่งปันว่าฉันมีปัญหาที่ใด:

curl -X POST http: // your-server-end-point -H "เนื้อหาประเภท: application / json" -d @ path-of-your-json-file.json

เห็นไหมฉันทำทุกอย่างถูกต้องมีเพียงสิ่งเดียวเท่านั้น - "@" ฉันพลาดไปก่อนเส้นทางของไฟล์ JSON

ฉันพบเอกสาร go-to ที่เกี่ยวข้องบนอินเทอร์เน็ต - https://gist.github.com/subfuzion/08c5d85437d5d4f00e58

หวังว่าจะช่วยได้ไม่กี่คน ขอบคุณ


1

หากคุณกำหนดค่า SWAGGER ให้กับแอปพลิเคชันบู๊ตสปริงและเรียกใช้ API ใด ๆ จากแอปพลิเคชันของคุณที่นั่นคุณจะเห็นคำขอ CURL นั้น

ฉันคิดว่านี่เป็นวิธีที่ง่ายในการสร้างคำขอผ่าน CURL


-6

คุณสามารถผ่านส่วนขยายของรูปแบบที่คุณต้องการในตอนท้ายของ URL ชอบhttp: // localhost: 8080 / xx / xxx / xxxx .json

หรือ

http: // localhost: 8080 / xx / xxx / xxxx .xml

หมายเหตุ: คุณต้องเพิ่มการพึ่งพา jackson และ jaxb maven ใน pom ของคุณ


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