kirim / kirim file xml menggunakan baris perintah curl

389

Bagaimana saya bisa mengirim / memposting file xml ke server lokal http: // localhost: 8080 menggunakan curl dari baris perintah?

Perintah apa yang harus saya gunakan?

Arnab Sen Gupta
sumber

Jawaban:

507

Jika pertanyaan itu terhubung ke pertanyaan Hudson Anda yang lain, gunakan perintah yang mereka berikan. Cara ini dengan XML dari baris perintah:

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

Anda perlu mengubahnya sedikit untuk membaca dari file:

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

Baca halaman manual . mengikuti abstrak untuk -d Parameter.

-d / - data

(HTTP) Mengirim data yang ditentukan dalam permintaan POST ke server HTTP, dengan cara yang sama seperti browser ketika pengguna telah mengisi formulir HTML dan menekan tombol kirim. Ini akan menyebabkan curl meneruskan data ke server menggunakan aplikasi tipe konten / x-www-form-urlencoded. Bandingkan dengan formulir -F / -.

-d / - data sama dengan --data-ascii. Untuk memposting data murni biner, Anda sebaiknya menggunakan opsi --data-binary. Untuk menyandikan URL nilai bidang formulir, Anda dapat menggunakan --data-urlencode.

Jika salah satu dari opsi ini digunakan lebih dari satu kali pada baris perintah yang sama, potongan data yang ditentukan akan digabungkan bersama dengan tanda & -simbol yang terpisah. Jadi, menggunakan '-d name = daniel -d skill = lousy' akan menghasilkan potongan postingan yang terlihat seperti 'name = daniel & skill = lousy'.

Jika Anda memulai data dengan huruf @, sisanya harus berupa nama file untuk membaca data dari, atau - jika Anda ingin ikal membaca data dari stdin. Isi file harus sudah disandikan URL. Beberapa file juga dapat ditentukan. Memposting data dari file bernama 'foobar' akan dilakukan dengan --data @foobar.

Peter Schuetze
sumber
2
Baca halaman manual. The contents of the file must already be URL-encoded.File XML OP tentu saja tidak.
Kolonel Panic
52
Selama Anda menentukan tipe konten, --header "Content-Type:application/xml"Anda tidak diharapkan untuk menyandikan URL
Kolonel Panic
12
Saya hanya akan menambahkan bahwa jika Anda menggunakan "-d" defaultnya ke POST, jadi tidak perlu menggunakan "-X" juga.
Tal Liron
4
jika Anda menggunakan opsi tindak pengalihan keriting ini -L, jangan tidak menggunakan -X POSTkarena akan membuat diarahkan permintaan penggunaan POST juga. Jika Anda hanya menggunakan -d seperti yang disarankan @Tai, ini tidak akan terjadi
Tristan Havelick
18
Berhati-hatilah karena -dstrip menghapus dari file. Untuk menghindari ini, gunakan --data-binarysaja.
Yar
189

Dari halaman manual , saya percaya ini adalah droid yang Anda cari:

-F/--form <name=content>

(HTTP) Ini memungkinkan ikal meniru bentuk yang diisi di mana pengguna telah menekan tombol kirim. Ini menyebabkan curl ke data POST menggunakan multipart / tipe-data Konten menurut RFC2388. Ini memungkinkan pengunggahan file biner dll. Untuk memaksa bagian 'konten' menjadi file, awali nama file dengan tanda @.

Contoh, untuk mengirim file kata sandi Anda ke server, di mana 'kata sandi' adalah nama bidang isian yang akan diinput oleh / etc / passwd:

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

Jadi dalam kasus Anda, ini akan menjadi sesuatu seperti
curl -F file=@/some/file/on/your/local/disk http://localhost:8080

Piskvor meninggalkan gedung
sumber
11
Solusi ini memiliki manfaat tambahan karena dapat menamai file yang dikirim (tidak seperti solusi yang dipilih di atas), dan oleh karena itu Anda dapat misalnya mengirim banyak file.
David Cairns
13
Formatnya file=@-sangat membantu jika Anda ingin mem -pipe file Anda.
Steven Lu
2
Jika ada orang yang ingin mengirim file dan informasi lainnya: gunakan -F key = val -F key = val sebanyak yang Anda butuhkan. Menutup semua parameter pos dalam satu string besar yang dipisahkan oleh & tidak berfungsi.
hgolov
Bisakah Anda menyebutkan cara menyiapkan halaman web penerima untuk dapat menerima file yang diunggah melalui curl dari desktop?
SexyBeast
@Cupidvogel: Seperti bidang unggahan file lainnya; tidak ada penanganan khusus untuk ikal.
Piskvor meninggalkan gedung
47

Anda dapat menggunakan opsi --data with file.

Tulis konten xml ke file bernama soap_get.xml dan gunakan perintah curl untuk mengirim permintaan:

curl -X POST - header "Tipe Konten: teks / xml; charset = UTF-8" --data @ soap_get.xml your_url

NgaNguyenDuy
sumber
Ini harus menjadi jawaban karena OP bertanya tentang memposting file bukan inline text.
FearlessFuture
Ini diperlukan untuk menampilkan "non escaped" untuk saya menggunakan server web spring, terima kasih!
rogerdpack
20

Dengan Jenkins 1.494, saya dapat mengirim file ke parameter pekerjaan di Ubuntu Linux 12.10 menggunakan curldengan --formparameter:

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

Di server Jenkins, saya mengonfigurasikan pekerjaan yang menerima satu parameter: nama file yang diunggah myfileparam.

Baris pertama dari panggilan ikal itu membangun formulir web dengan parameter bernama myfileparam(sama seperti dalam pekerjaan); nilainya akan menjadi isi file pada sistem file lokal bernama /local/path/to/your/file.txt. Itu@ simbol awalan memberitahu curl untuk mengirim file lokal bukan nama file yang diberikan.

Baris kedua mendefinisikan permintaan JSON yang cocok dengan parameter formulir di baris satu: parameter file bernama myfileparam.

Baris ketiga mengaktifkan tombol Build form. Baris keempat adalah URL pekerjaan dengan akhiran "/ build".

Jika panggilan ini berhasil, ikal kembali 0. Jika tidak berhasil, kesalahan atau pengecualian dari layanan dicetak ke konsol. Jawaban ini mengambil banyak dari posting blog lama yang berhubungan dengan Hudson , yang saya mendekonstruksi dan bekerja kembali untuk kebutuhan saya sendiri.

Steve HHH
sumber
6

Inilah cara Anda dapat POST XML pada Windows menggunakan baris perintah curl pada Windows. Lebih baik gunakan file batch / .cmd untuk itu:

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"
Gleb Esman
sumber
Bagaimana Anda memformat string xml sebelum menggunakan dengan perintah curl
Chinmoy
3

Jika Anda memiliki beberapa tajuk maka Anda mungkin ingin menggunakan yang berikut:

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

Anda dapat menggunakan perintah ini:

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 
Musleh Uddin
sumber
1

Jika Anda menggunakan curl di 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
Paul Vargas
sumber