wyślij / opublikuj plik xml za pomocą wiersza polecenia curl

388

Jak mogę wysłać / opublikować plik XML na serwerze lokalnym http: // localhost: 8080 przy użyciu curl z wiersza poleceń?

Jakiego polecenia powinienem użyć?

Arnab Sen Gupta
źródło

Odpowiedzi:

505

Jeśli to pytanie jest powiązane z innymi pytaniami Hudsona, użyj polecenia, które podają. W ten sposób za pomocą XML z wiersza poleceń:

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

Musisz to trochę zmienić, aby odczytać z pliku:

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

Przeczytaj stronę podręcznika . zgodnie ze streszczeniem parametru -d.

-d / - dane

(HTTP) Wysyła określone dane w żądaniu POST do serwera HTTP, w taki sam sposób, jak przeglądarka, gdy użytkownik wypełni formularz HTML i naciska przycisk wysyłania. Spowoduje to, że curl przekaże dane do serwera za pomocą aplikacji typu treści / x-www-form-urlencoded. Porównaj z formularzem -F / -.

-d / - data jest taka sama jak --data-ascii. Aby opublikować dane czysto binarne, należy zamiast tego użyć opcji --data-binary. Aby zakodować URL wartości pola formularza, możesz użyć --data-urlencode.

Jeśli którakolwiek z tych opcji zostanie użyta więcej niż jeden raz w tym samym wierszu poleceń, określone elementy danych zostaną scalone razem z separatorem i symbolem. Tak więc użycie „-d name = daniel -d skill = lousy” wygeneruje fragment postu, który wygląda jak „name = daniel & skill = lousy”.

Jeśli zaczynasz dane literą @, reszta powinna być nazwą pliku, z którego można odczytać dane, lub - jeśli chcesz, aby curl odczytał dane ze standardowego wejścia. Zawartość pliku musi być już zakodowana w adresie URL. Można również podać wiele plików. Wysyłanie danych z pliku o nazwie „foobar” byłoby zatem wykonywane przy pomocy --data @foobar.

Peter Schuetze
źródło
2
Przeczytaj stronę podręcznika. The contents of the file must already be URL-encoded.Pliki XML OP na pewno nie są.
Pułkownik Panic
52
Tak długo, jak określisz typ zawartości, --header "Content-Type:application/xml"który nie ma być kodowany w adresie URL
pułkownik Panic
12
Dodam tylko, że jeśli użyjesz „-d”, domyślnie ustawiony jest na POST, więc nie ma również potrzeby używania „-X”.
Tal Liron
4
jeśli używasz opcji curl's follow redirects -L, nie używaj, -X POSTponieważ spowoduje to, że przekierowane żądanie będzie używać POST. Jeśli użyjesz -d jak sugeruje @Tai, tak się nie stanie
Tristan Havelick
18
Ostrzegamy, że -dusuwa podziały linii z plików. Aby tego uniknąć, użyj --data-binaryzamiast tego.
Yar
189

Z strony podręcznika uważam, że są to droidy, których szukasz:

-F/--form <name=content>

(HTTP) Pozwala to curl emulować wypełniony formularz, w którym użytkownik nacisnął przycisk wysyłania. Powoduje to zawijanie się do danych POST przy użyciu danych wieloczęściowych / formularzy typu treści zgodnie z RFC2388. Umożliwia to przesyłanie plików binarnych itp. Aby wymusić, aby część „treść” była plikiem, poprzedź nazwę pliku znakiem @.

Przykład: wysłanie pliku z hasłem na serwer, gdzie „hasło” to nazwa pola formularza, do którego należy wpisać / etc / passwd:

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

W twoim przypadku byłoby to coś takiego
curl -F file=@/some/file/on/your/local/disk http://localhost:8080

Piskvor opuścił budynek
źródło
11
To rozwiązanie ma tę dodatkową zaletę, że może nadać nazwę wysyłanemu plikowi (w przeciwieństwie do wybranego powyżej rozwiązania), a zatem można np. Wysłać wiele plików.
David Cairns,
13
Format file=@-jest przydatny, jeśli chcesz przesłać swój plik do potoku.
Steven Lu
2
Jeśli ktoś chce wysłać plik i inne informacje: użyj -F klucz = val -F klucz = val tyle razy, ile potrzebujesz. Umieszczanie wszystkich parametrów postu w jednym dużym ciągu oddzielonym znakiem & nie działa.
hgolov
Czy możesz wspomnieć, jak przygotować odbierającą stronę internetową, aby móc odbierać pliki przesłane za pomocą curl z komputera?
SexyBeast
@Cupidvogel: Jak każde inne pole do przesyłania plików; nie ma specjalnego sposobu obchodzenia się z lokami.
Piskvor opuścił budynek
47

Możesz użyć opcji --data z plikiem.

Zapisz zawartość xml do pliku o nazwie soap_get.xml i za pomocą polecenia curl wyślij żądanie:

curl -X POST --header "Content-Type: text / xml; charset = UTF-8" --data @ soap_get.xml twoja_url

NgaNguyenDuy
źródło
To powinna być odpowiedź, ponieważ PO prosi o opublikowanie pliku, który nie jest tekstem wbudowanym.
FearlessFuture,
Było to konieczne, aby mógł wyświetlać się dla mnie jako „bez ucieczki” przy użyciu wiosennego serwera WWW, dzięki!
rogerdpack
20

Z Jenkins 1.494, udało mi się wysłać plik do parametru pracy na Ubuntu 12.10 przy użyciu curlz --formparametrami:

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

Na serwerze Jenkins skonfigurowałem zadanie, które akceptuje jeden parametr: parametr wysyłania pliku o nazwie myfileparam .

Pierwszy wiersz tego wywołania curl tworzy formularz internetowy z parametrem o nazwie myfileparam(takim samym jak w zadaniu); jego wartością będzie zawartość pliku w lokalnym systemie plików o nazwie /local/path/to/your/file.txt. @Symbol przedrostka mówi curl wysłać plik lokalny zamiast podanej nazwie.

Drugi wiersz definiuje żądanie JSON pasujące do parametrów formularza w wierszu pierwszym: parametr pliku o nazwie myfileparam.

Trzeci wiersz aktywuje przycisk kompilacji formularza. Czwarty wiersz to adres URL zadania z przyrostkiem „/ build”.

Jeśli to połączenie się powiedzie, curl powraca 0. Jeśli się nie powiedzie, błąd lub wyjątek z usługi zostanie wydrukowany na konsoli. Ta odpowiedź wiele bierze ze starego posta na blogu dotyczącego Hudsona , który zdekonstruowałem i przerobiłem na własne potrzeby.

Steve HHH
źródło
6

Oto, w jaki sposób możesz POST XML w systemie Windows za pomocą wiersza polecenia curl w systemie Windows. Lepiej użyj do tego pliku wsadowego / .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"
Gleb Esman
źródło
Jak sformatować ciąg xml przed użyciem z poleceniem curl
Chinmoy
3

Jeśli masz wiele nagłówków, możesz użyć następujących opcji:

curl -X POST --header "Content-Type:application/json" --header "X-Auth:AuthKey" --data @hello.json Your_url
Dheeraj R.
źródło
3

Możesz użyć tego polecenia:

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
źródło
1

Jeśli używasz curl w systemie 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
źródło