XML-Datei über die Curl-Befehlszeile senden / veröffentlichen

389

Wie kann ich eine XML-Datei mit curl über die Befehlszeile an einen lokalen Server senden / senden http: // localhost: 8080 ?

Welchen Befehl soll ich verwenden?

Arnab Sen Gupta
quelle

Antworten:

507

Wenn diese Frage mit Ihren anderen Hudson-Fragen verbunden ist, verwenden Sie den von ihnen bereitgestellten Befehl. Auf diese Weise mit XML über die Befehlszeile:

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

Sie müssen es ein wenig ändern, um aus einer Datei zu lesen:

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

Lesen Sie die Manpage . nach einer Zusammenfassung für -d Parameter.

-d / - Daten

(HTTP) Sendet die angegebenen Daten in einer POST-Anforderung an den HTTP-Server auf dieselbe Weise wie ein Browser, wenn ein Benutzer ein HTML-Formular ausgefüllt und die Senden-Schaltfläche gedrückt hat. Dies führt dazu, dass Curl die Daten mit der Inhaltstyp-Anwendung / x-www-form-urlencoded an den Server weiterleitet. Vergleiche mit -F / - Form.

-d / - Daten sind die gleichen wie --data-ascii. Um Daten rein binär zu veröffentlichen, sollten Sie stattdessen die Option --data-binary verwenden. Um den Wert eines Formularfelds per URL zu codieren, können Sie --data-urlencode verwenden.

Wenn eine dieser Optionen mehrmals in derselben Befehlszeile verwendet wird, werden die angegebenen Datenelemente mit einem trennenden & -Symbol zusammengeführt. Die Verwendung von '-d Name = Daniel -d Skill = Lousy' würde also einen Post-Chunk erzeugen, der wie 'Name = Daniel & Skill = Lousy' aussieht.

Wenn Sie die Daten mit dem Buchstaben @ beginnen, sollte der Rest ein Dateiname sein, aus dem die Daten gelesen werden sollen, oder - wenn Sie möchten, dass Curl die Daten aus stdin liest. Der Inhalt der Datei muss bereits URL-codiert sein. Es können auch mehrere Dateien angegeben werden. Das Posten von Daten aus einer Datei mit dem Namen "foobar" würde daher mit --data @foobar erfolgen.

Peter Schuetze
quelle
2
Lesen Sie die Manpage. The contents of the file must already be URL-encoded.OPs XML-Dateien sind es sicherlich nicht.
Colonel Panic
52
Solange Sie den Inhaltstyp angeben --header "Content-Type:application/xml", wird keine URL-Codierung
Colonel Panic
12
Ich füge nur hinzu, dass bei Verwendung von "-d" standardmäßig POST verwendet wird, sodass auch "-X" nicht verwendet werden muss.
Tal Liron
4
wenn Sie curl Follow Redirects Option verwenden -L, kann nicht verwendet werden, -X POSTda es zu Anfrage Verwendung POST umgeleitet machen. Wenn Sie nur -d verwenden, wie @Tai vorschlägt, wird dies nicht passieren
Tristan Havelick
18
Seien Sie gewarnt, dass -dZeilenumbrüche von Dateien entfernt werden. Um dies zu vermeiden, verwenden Sie --data-binarystattdessen.
Yar
189

Auf der Manpage glaube ich, dass dies die Droiden sind, nach denen Sie suchen:

-F/--form <name=content>

(HTTP) Hiermit kann Curl ein ausgefülltes Formular emulieren, in dem ein Benutzer die Senden-Schaltfläche gedrückt hat. Dies führt dazu, dass sich POST-Daten unter Verwendung der Multipart- / Formulardaten vom Inhaltstyp gemäß RFC2388 kräuseln. Dies ermöglicht das Hochladen von Binärdateien usw. Um zu erzwingen, dass der Inhaltsteil eine Datei ist, müssen Sie dem Dateinamen ein @ -Zeichen voranstellen.

Beispiel, um Ihre Kennwortdatei an den Server zu senden, wobei 'Kennwort' der Name des Formularfelds ist, in das / etc / passwd eingegeben wird:

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

In Ihrem Fall wäre dies also so etwas wie
curl -F file=@/some/file/on/your/local/disk http://localhost:8080

Piskvor verließ das Gebäude
quelle
11
Diese Lösung hat den zusätzlichen Vorteil, dass sie die gesendete Datei benennen kann (im Gegensatz zu der oben gewählten Lösung), und Sie können daher z. B. mehrere Dateien senden.
David Cairns
13
Das Format file=@-ist hilfreich, wenn Sie Ihre Datei einleiten möchten.
Steven Lu
2
Falls jemand eine Datei und andere Informationen senden möchte: Verwenden Sie -F key = val -F key = val so oft Sie möchten. Das Einschließen aller Post-Parameter in eine große Zeichenfolge, die durch & getrennt ist, funktioniert nicht.
Hgolov
Können Sie erwähnen, wie Sie die empfangende Webseite vorbereiten, um die per Curl hochgeladenen Dateien vom Desktop empfangen zu können?
SexyBeast
@Cupidvogel: Wie jedes andere Feld zum Hochladen von Dateien; Es gibt keine spezielle Handhabung speziell für Locken.
Piskvor verließ das Gebäude
47

Sie können die Option --data mit Datei verwenden.

Schreiben Sie XML-Inhalte in eine Datei mit dem Namen soap_get.xml und senden Sie die Anforderung mit dem Befehl curl:

curl -X POST --header "Inhaltstyp: text / xml; Zeichensatz = UTF-8" --data @ soap_get.xml your_url

NgaNguyenDuy
quelle
Dies sollte die Antwort sein, da das OP nach dem Posten einer Datei fragt, die keinen Inline-Text enthält.
FearlessFuture
Dies war notwendig, damit es für mich mit dem Spring Web Server "nicht entkommen" angezeigt wurde, danke!
Rogerdpack
20

Mit Jenkins 1.494, konnte ich eine Datei in einen Job - Parameter auf Ubuntu Linux 12.10 mit senden curlmit --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

Auf dem Jenkins-Server habe ich einen Job konfiguriert, der einen einzelnen Parameter akzeptiert: einen Parameter zum Hochladen von Dateien mit dem Namen myfileparam.

Die erste Zeile dieses Curl-Aufrufs erstellt ein Webformular mit einem Parameter namens myfileparam(wie im Job). Sein Wert ist der Inhalt einer Datei im genannten lokalen Dateisystem /local/path/to/your/file.txt. Das@ Symbolpräfix weist curl an, anstelle des angegebenen Dateinamens eine lokale Datei zu senden.

Die zweite Zeile definiert eine JSON-Anforderung, die mit den Formularparametern in Zeile 1 übereinstimmt: einen Dateiparameter mit dem Namen myfileparam.

Die dritte Zeile aktiviert die Schaltfläche Erstellen des Formulars. Die vierte Zeile ist die Job-URL mit dem Suffix "/ build".

Wenn dieser Aufruf erfolgreich ist, kehrt curl zurück 0. Wenn dies nicht erfolgreich ist, wird der Fehler oder die Ausnahme vom Dienst auf der Konsole gedruckt. Diese Antwort stammt aus einem alten Blog-Beitrag über Hudson , den ich dekonstruiert und für meine eigenen Bedürfnisse überarbeitet habe.

Steve HHH
quelle
6

So können Sie XML unter Windows mithilfe der Curl-Befehlszeile unter Windows POSTEN. Verwenden Sie dazu besser die Batch- / CMD-Datei:

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
quelle
Wie forma u die XML - Zeichenfolge , bevor sie mit curl Befehl
Chinmoy
3

Wenn Sie mehrere Header haben, möchten Sie möglicherweise Folgendes verwenden:

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

Sie können diesen Befehl verwenden:

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
quelle
1

Wenn Sie Curl unter Windows verwenden:

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
quelle