invia / pubblica file xml usando la riga di comando curl


Risposte:


507

Se quella domanda è collegata alle altre tue domande su Hudson, usa il comando che forniscono. In questo modo con XML dalla riga di comando:

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

Devi cambiarlo un po 'per leggere da un file:

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

Leggi la manpage . seguendo un abstract per -d Parameter.

-d / - dati

(HTTP) Invia i dati specificati in una richiesta POST al server HTTP, come fa un browser quando un utente ha compilato un modulo HTML e preme il pulsante di invio. Ciò farà arricciare i dati al server utilizzando il tipo di contenuto application / x-www-form-urlencoded. Confronta con -F / - form.

-d / - i dati sono gli stessi di --data-ascii. Per pubblicare dati puramente binari, devi invece usare l'opzione --data-binary. Per codificare l'URL del valore di un campo modulo è possibile utilizzare --data-urlencode.

Se una di queste opzioni viene utilizzata più di una volta sulla stessa riga di comando, i pezzi di dati specificati verranno uniti con un simbolo & di separazione. Quindi, usando '-d name = daniel -d skill = lousy' si genererebbe un post post che assomiglia a 'name = daniel & skill = lousy'.

Se inizi i dati con la lettera @, il resto dovrebbe essere un nome di file da cui leggere i dati, oppure - se vuoi che l'arricciatura legga i dati da stdin. Il contenuto del file deve essere già codificato nell'URL. È inoltre possibile specificare più file. La pubblicazione di dati da un file chiamato "foobar" verrebbe quindi eseguita con --data @foobar.


2
Leggi la manpage. The contents of the file must already be URL-encoded.I file XML di OP sicuramente non lo sono.
Colonnello Panic,

52
Fintanto che specifichi il tipo di contenuto --header "Content-Type:application/xml"che non ti aspetti che codifichi URL
Colonnello Panic,

12
Aggiungerò semplicemente che se usi "-d" per impostazione predefinita è POST, quindi non è necessario usare anche "-X".
Tal Liron,

4
se stai usando l'opzione segui i reindirizzamenti di curl -L, non usarlo -X POSTperché farà reindirizzare la richiesta anche usando POST. Se usi solo -d come suggerisce @Tai, questo non accadrà
Tristan Havelick,

18
Tieni presente che -delimina le interruzioni di riga dai file. Per evitare ciò, utilizzare --data-binaryinvece.
Anno

189

Dalla manpage , credo che questi siano i droidi che stai cercando:

-F/--form <name=content>

(HTTP) Ciò consente all'arricciatura di emulare un modulo compilato in cui un utente ha premuto il pulsante di invio. Ciò provoca l'arricciamento dei dati POST utilizzando il tipo di contenuto multipart / form-data secondo RFC2388. Ciò consente il caricamento di file binari ecc. Per forzare la parte 'content' in un file, aggiungere il prefisso al nome del file con un segno @.

Esempio, per inviare il file della password al server, dove "password" è il nome del campo modulo a cui / etc / passwd sarà l'input:

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

Quindi nel tuo caso, sarebbe qualcosa del genere
curl -F file=@/some/file/on/your/local/disk http://localhost:8080


11
Questa soluzione ha l'ulteriore vantaggio di essere in grado di nominare il file inviato (diversamente dalla soluzione scelta sopra), e quindi puoi ad esempio inviare più file.
David Cairns,

13
Il formato file=@-è utile se vuoi reindirizzare il tuo file.
Steven Lu

2
Nel caso in cui qualcuno stia cercando di inviare un file e altre informazioni: utilizzare -F key = val -F key = val tutte le volte che è necessario. Racchiudere tutti i parametri di post in una stringa di grandi dimensioni separati da & non funziona.
hgolov,

Puoi menzionare come preparare la pagina Web di ricezione per poter ricevere i file caricati via curl dal desktop?
SexyBeast,

@Cupidvogel: come qualsiasi altro campo di upload di file; non esiste una gestione speciale specifica per l'arricciatura.
Piskvor lasciò l'edificio

47

Puoi usare l'opzione --data con il file.

Scrivi il contenuto XML in un file chiamato soap_get.xml e usa il comando curl per inviare la richiesta:

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


Questa dovrebbe essere la risposta poiché l'OP chiede di pubblicare un file non in linea.
FearlessFuture

Questo era necessario per mostrarmi "non fuggito" per me usando il web server di primavera, grazie!
rogerdpack

20

Con Jenkins 1.494, sono stato in grado di inviare un file a un parametro di lavoro su Ubuntu Linux 12.10 utilizzando curlcon i --formparametri:

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

Sul server Jenkins, ho configurato un lavoro che accetta un singolo parametro: un parametro di caricamento file denominato myfileparam.

La prima riga di quella chiamata a ricciolo costruisce un modulo web con un parametro chiamato myfileparam(uguale al lavoro); il suo valore sarà il contenuto di un file nel file system locale denominato /local/path/to/your/file.txt. Il @prefisso del simbolo indica all'arricciatura di inviare un file locale anziché il nome file specificato.

La seconda riga definisce una richiesta JSON che corrisponde ai parametri del modulo nella prima riga: un parametro file denominato myfileparam.

La terza riga attiva il pulsante Build del modulo. La quarta riga è l'URL del lavoro con il suffisso "/ build".

Se questa chiamata ha esito positivo, il ricciolo ritorna 0. Se non riesce, l'errore o l'eccezione dal servizio viene stampato sulla console. Questa risposta prende molto da un vecchio post sul blog relativo a Hudson , che ho decostruito e rielaborato per le mie esigenze.


6

Ecco come puoi POST XML su Windows usando la linea di comando curl su Windows. Meglio usare il file batch / .cmd per quello:

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"

Come formattare la stringa xml prima di usarla con il comando curl
Chinmoy,

3

Se hai più intestazioni, ti consigliamo di utilizzare quanto segue:

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

3

Puoi usare questo comando:

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

Se stai usando l' arricciatura su 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.