ส่ง / โพสต์ไฟล์ xml โดยใช้บรรทัดคำสั่ง curl


คำตอบ:


505

หากคำถามนั้นเชื่อมต่อกับคำถามฮัดสันอื่น ๆ ของคุณให้ใช้คำสั่งที่จัดเตรียมไว้ วิธีนี้ด้วย XML จากบรรทัดคำสั่ง:

$ curl -X POST -d '<run>...</run>' \
http://user:pass@myhost:myport/path/of/url

คุณต้องเปลี่ยนไฟล์เพื่ออ่านจากไฟล์:

 $ curl -X POST -d @myfilename http://user:pass@myhost:myport/path/of/url

อ่านmanpage การติดตาม abstract สำหรับ -d Parameter

-d / - ข้อมูล

(HTTP) ส่งข้อมูลที่ระบุในคำขอ POST ไปยังเซิร์ฟเวอร์ HTTP ในลักษณะเดียวกับที่เบราว์เซอร์ทำเมื่อผู้ใช้กรอกแบบฟอร์ม HTML และกดปุ่มส่ง สิ่งนี้จะทำให้ curl ส่งผ่านข้อมูลไปยังเซิร์ฟเวอร์โดยใช้ application-type application / x-www-form-urlencoded เปรียบเทียบกับ -F / - แบบฟอร์ม

-d / - data เหมือนกับ --data-ascii ในการโพสต์ข้อมูลไบนารีอย่างหมดจดคุณควรใช้ตัวเลือก --data-binary แทน หากต้องการเข้ารหัส URL ค่าของเขตข้อมูลฟอร์มคุณสามารถใช้ --data-urlencode

หากมีการใช้ตัวเลือกใด ๆ เหล่านี้มากกว่าหนึ่งครั้งในบรรทัดคำสั่งเดียวกันส่วนข้อมูลที่ระบุจะถูกรวมเข้าด้วยกันด้วยการแยก & -symbol ดังนั้นการใช้ '-d name = daniel -d skill = lousy' จะสร้างกลุ่มโพสต์ที่ดูเหมือน 'name = daniel & skill = lousy'

หากคุณเริ่มต้นข้อมูลด้วยตัวอักษร @ ส่วนที่เหลือควรเป็นชื่อไฟล์เพื่ออ่านข้อมูลหรือ - หากคุณต้องการให้ curl อ่านข้อมูลจาก stdin เนื้อหาของไฟล์จะต้องมีการเข้ารหัส URL แล้ว สามารถระบุหลายไฟล์ได้ การโพสต์ข้อมูลจากไฟล์ชื่อ 'foobar' จะทำได้ด้วย --data @foobar


2
อ่าน manpage The contents of the file must already be URL-encoded.ไฟล์ XML ของ OP ไม่แน่นอน
พันเอก Panic

52
ตราบใดที่คุณระบุประเภทเนื้อหา--header "Content-Type:application/xml"คุณไม่คาดว่าจะเข้ารหัส URL
Colonel Panic

12
ฉันจะเพิ่มว่าถ้าคุณใช้ "-d" มันเป็นค่าเริ่มต้นเพื่อ POST ดังนั้นไม่จำเป็นต้องใช้ "-X" เช่นกัน
Tal Liron

4
ถ้าคุณกำลังใช้ขดตัวเลือกของการติดตามการเปลี่ยนเส้นทาง-Lไม่ได้ใช้-X POSTมันจะทำให้การใช้งานที่เปลี่ยนเส้นทางการร้องขอ POST เกินไป หากคุณใช้ -d ตามที่ @Tai แนะนำสิ่งนี้จะไม่เกิดขึ้น
Tristan Havelick

18
ได้รับการเตือนว่า-dแถบแบ่งบรรทัดจากไฟล์ เพื่อหลีกเลี่ยงปัญหานี้ให้ใช้--data-binaryแทน
Yar

189

จากmanpageฉันเชื่อว่านี่เป็นหุ่นที่คุณกำลังมองหา:

-F/--form <name=content>

(HTTP) วิธีนี้ช่วยให้ขดเลียนแบบฟอร์มที่ผู้ใช้กดปุ่มส่ง สิ่งนี้ทำให้เกิดการขดข้อมูล POST โดยใช้หลายประเภทเนื้อหา / แบบฟอร์มข้อมูลตาม RFC2388 สิ่งนี้ช่วยให้การอัปโหลดไฟล์ไบนารีเป็นต้นหากต้องการบังคับให้ส่วน 'เนื้อหา' เป็นไฟล์ให้ขึ้นหน้าชื่อไฟล์ด้วยเครื่องหมาย @

ตัวอย่างเช่นในการส่งไฟล์รหัสผ่านของคุณไปยังเซิร์ฟเวอร์โดยที่ 'password' เป็นชื่อของ form-field ซึ่ง / etc / passwd จะเป็นอินพุต:

curl -F password=@/etc/passwd www.mypasswords.com

ดังนั้นในกรณีของคุณสิ่งนี้จะเป็นอย่างไร
curl -F file=@/some/file/on/your/local/disk http://localhost:8080


11
โซลูชันนี้มีประโยชน์เพิ่มเติมในการตั้งชื่อไฟล์ที่ส่ง (ไม่เหมือนกับโซลูชันที่เลือกไว้ด้านบน) และคุณสามารถส่งไฟล์ได้หลายไฟล์
David Cairns

13
รูปแบบfile=@-มีประโยชน์หากคุณต้องการไพพ์ไฟล์ของคุณ
Steven Lu

2
ในกรณีที่ทุกคนต้องการส่งไฟล์และข้อมูลอื่น ๆ : ใช้ -F key = val -F key = val หลายครั้งตามที่คุณต้องการ การล้อมรอบพารามิเตอร์การโพสต์ทั้งหมดในสตริงขนาดใหญ่ที่คั่นด้วย & ไม่ทำงาน
hgolov

คุณสามารถพูดถึงวิธีการเตรียมเว็บเพจที่รับเพื่อให้สามารถรับไฟล์ที่อัพโหลดผ่าน curl จากเดสก์ท็อปได้หรือไม่?
SexyBeast

@Cupidvogel: เช่นเดียวกับเขตข้อมูลอัปโหลดไฟล์อื่น ๆ ไม่มีการจัดการพิเศษสำหรับขดเป็นพิเศษ
Piskvor ออกจากอาคารใน

47

คุณสามารถใช้ตัวเลือก - ข้อมูลพร้อมไฟล์

เขียนเนื้อหา xml ไปยังไฟล์ชื่อ soap_get.xml และใช้คำสั่ง curl เพื่อส่งคำขอ:

curl -X POST - ส่วนหัว "Content-Type: text / xml; charset = UTF-8" --data @ soap_get.xml your_url


นี่ควรเป็นคำตอบเนื่องจาก OP กำลังถามเกี่ยวกับการโพสต์ไฟล์ที่ไม่ใช่ข้อความแบบอินไลน์
FearlessFuture

นี่เป็นสิ่งจำเป็นสำหรับการแสดง "ไม่หนี" สำหรับฉันโดยใช้เว็บเซิร์ฟเวอร์ในฤดูใบไม้ผลิขอบคุณ!
rogerdpack

20

ด้วย Jenkins 1.494 ฉันสามารถส่งไฟล์ไปยังพารามิเตอร์งานบน Ubuntu Linux 12.10 โดยใช้curlกับ--formพารามิเตอร์:

curl --form name=myfileparam --form file=@/local/path/to/your/file.xml \
  -Fjson='{"parameter": {"name": "myfileparam", "file": "file"}}' \
  -Fsubmit=Build \
  http://user:password@jenkinsserver/job/jobname/build

บนเซิร์ฟเวอร์เจนกินส์ผมกำหนดค่างานที่รับพารามิเตอร์เดียว: myfileparamพารามิเตอร์การอัปโหลดไฟล์ชื่อ

บรรทัดแรกของการเรียก curl นั้นจะสร้างเว็บฟอร์มพร้อมพารามิเตอร์ชื่อmyfileparam(เหมือนกับในงาน); /local/path/to/your/file.txtค่าของมันจะเป็นเนื้อหาของไฟล์บนระบบไฟล์ท้องถิ่นชื่อ ส่วน@นำหน้าสัญลักษณ์บอกให้ curl ส่งไฟล์โลคัลแทนชื่อไฟล์ที่กำหนด

บรรทัดที่สองกำหนดคำขอ JSON ที่ตรงกับรูปแบบพารามิเตอร์ในบรรทัดที่หนึ่ง: myfileparamพารามิเตอร์ไฟล์ชื่อ

บรรทัดที่สามเปิดใช้งานปุ่มสร้างของฟอร์ม บรรทัดที่สี่คือ URL ของงานที่มีคำต่อท้าย "/ build"

0ถ้าสายนี้จะประสบความสำเร็จขดผลตอบแทน หากไม่สำเร็จข้อผิดพลาดหรือข้อยกเว้นจากบริการจะถูกพิมพ์ไปยังคอนโซล คำตอบนี้ใช้เวลามากจากการโพสต์บล็อกเก่าที่เกี่ยวข้องกับฮัดสันซึ่งฉันแยกชิ้นส่วนและทำงานใหม่ตามความต้องการของฉันเอง


6

นี่คือวิธีที่คุณสามารถ POST XML บน Windows โดยใช้คำสั่ง curl บน Windows ใช้ไฟล์ batch / .cmd ดีกว่าเพื่อ:

curl -i -X POST -H "Content-Type: text/xml" -d             ^
"^<?xml version=\"1.0\" encoding=\"UTF-8\" ?^>                ^
    ^<Transaction^>                                           ^
        ^<SomeParam1^>Some-Param-01^</SomeParam1^>            ^
        ^<Password^>SomePassW0rd^</Password^>                 ^
        ^<Transaction_Type^>00^</Transaction_Type^>           ^
        ^<CardHoldersName^>John Smith^</CardHoldersName^>     ^
        ^<DollarAmount^>9.97^</DollarAmount^>                 ^
        ^<Card_Number^>4111111111111111^</Card_Number^>       ^
        ^<Expiry_Date^>1118^</Expiry_Date^>                   ^
        ^<VerificationStr2^>123^</VerificationStr2^>          ^
        ^<CVD_Presence_Ind^>1^</CVD_Presence_Ind^>            ^
        ^<Reference_No^>Some Reference Text^</Reference_No^>  ^
        ^<Client_Email^>john@smith.com^</Client_Email^>       ^
        ^<Client_IP^>123.4.56.7^</Client_IP^>                 ^
        ^<Tax1Amount^>^</Tax1Amount^>                         ^
        ^<Tax2Amount^>^</Tax2Amount^>                         ^
    ^</Transaction^>                                          ^
" "http://localhost:8080"

คุณจัดรูปแบบสตริง xml อย่างไรก่อนที่จะใช้กับคำสั่ง curl
Chinmoy

3

หากคุณมีหลายส่วนหัวคุณอาจต้องการใช้สิ่งต่อไปนี้:

curl -X POST --header "Content-Type:application/json" --header "X-Auth:AuthKey" --data @hello.json Your_url

3

คุณสามารถใช้คำสั่งนี้:

curl -X POST --header 'Content-Type: multipart/form-data' --header 'Accept: application/json' --header 'Authorization: <<Removed>>' -F file=@"/home/xxx/Desktop/customers.json"  'API_SERVER_URL' -k 

1

หากคุณใช้curlบน Windows:

curl -H "Content-Type: application/xml" -d "<?xml version="""1.0""" encoding="""UTF-8""" standalone="""yes"""?><message><sender>Me</sender><content>Hello!</content></message>" http://localhost:8080/webapp/rest/hello
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.