envoyer / publier un fichier xml en utilisant la ligne de commande curl

Réponses:

507

Si cette question est connectée à vos autres questions Hudson, utilisez la commande qu'elles fournissent. De cette façon, avec XML à partir de la ligne de commande:

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

Vous devez le modifier un peu pour lire un fichier:

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

Lisez la page de manuel . suivant un résumé pour -d Parameter.

-d / - données

(HTTP) Envoie les données spécifiées dans une demande POST au serveur HTTP, de la même manière qu'un navigateur lorsqu'un utilisateur a rempli un formulaire HTML et appuie sur le bouton Soumettre. Cela entraînera curl à transmettre les données au serveur à l'aide de l'application de type de contenu / x-www-form-urlencoded. Comparer au formulaire -F / -.

-d / - les données sont les mêmes que --data-ascii. Pour publier des données purement binaires, vous devez plutôt utiliser l'option --data-binary. Pour encoder en URL la valeur d'un champ de formulaire, vous pouvez utiliser --data-urlencode.

Si l'une de ces options est utilisée plusieurs fois sur la même ligne de commande, les éléments de données spécifiés seront fusionnés avec un symbole & séparateur. Ainsi, l'utilisation de «-d nom = daniel -d compétence = moche» générerait un bloc de message qui ressemble à «nom = daniel et compétence = moche».

Si vous démarrez les données avec la lettre @, le reste doit être un nom de fichier pour lire les données, ou - si vous voulez que curl lise les données depuis stdin. Le contenu du fichier doit déjà être encodé en URL. Plusieurs fichiers peuvent également être spécifiés. La publication des données d'un fichier nommé 'foobar' se ferait donc avec --data @foobar.

Peter Schuetze
la source
2
Lisez la page de manuel. The contents of the file must already be URL-encoded.Les fichiers XML d'OP ne le sont certainement pas.
Colonel Panic,
52
Tant que vous spécifiez le type de contenu que --header "Content-Type:application/xml"vous ne devez pas coder
Colonel Panic
12
J'ajouterai simplement que si vous utilisez "-d", il s'agit par défaut de POST, il n'est donc pas nécessaire d'utiliser également "-X".
Tal Liron
4
si vous utilisez l'option de redirection de suivi de curl -L, ne l' utilisez pas-X POST car cela fera que la demande redirigée utilisera aussi POST. Si vous utilisez simplement -d comme @Tai le suggère, cela ne se produira pas
Tristan Havelick
18
Soyez averti que les -dsauts de ligne sont supprimés des fichiers. Pour éviter cela, utilisez --data-binaryplutôt.
Yar
189

D'après la page de manuel , je pense que ce sont les droïdes que vous recherchez:

-F/--form <name=content>

(HTTP) Cela permet à curl d'émuler un formulaire rempli dans lequel un utilisateur a appuyé sur le bouton d'envoi. Cela provoque une boucle vers les données POST à ​​l'aide des données de type / parties multiparties de type de contenu selon RFC2388. Cela permet de télécharger des fichiers binaires, etc. Pour forcer la partie «contenu» à être un fichier, préfixez le nom du fichier avec un signe @.

Exemple, pour envoyer votre fichier de mot de passe au serveur, où «mot de passe» est le nom du champ de formulaire dans lequel / etc / passwd sera l'entrée:

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

Donc, dans votre cas, ce serait quelque chose comme
curl -F file=@/some/file/on/your/local/disk http://localhost:8080

Piskvor a quitté le bâtiment
la source
11
Cette solution a l'avantage supplémentaire de pouvoir nommer le fichier envoyé (contrairement à la solution choisie ci-dessus), et vous pouvez donc par exemple envoyer plusieurs fichiers.
David Cairns
13
Le format file=@-est utile si vous souhaitez rediriger votre fichier vers.
Steven Lu
2
Si quelqu'un souhaite envoyer un fichier et d'autres informations: utilisez -F key = val -F key = val autant de fois que nécessaire. Mettre tous les paramètres de publication dans une grande chaîne séparée par & ne fonctionne pas.
hgolov
Pouvez-vous indiquer comment préparer la page Web de réception pour pouvoir recevoir les fichiers téléchargés via curl depuis le bureau?
SexyBeast
@Cupidvogel: comme tout autre champ de téléchargement de fichiers; il n'y a pas de manipulation spéciale spécifiquement pour la boucle.
Piskvor a quitté le bâtiment
47

Vous pouvez utiliser l'option --data avec le fichier.

Écrivez le contenu xml dans un fichier nommé soap_get.xml et utilisez la commande curl pour envoyer la demande:

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

NgaNguyenDuy
la source
Cela devrait être la réponse puisque l'OP demande de publier un fichier et non du texte en ligne.
FearlessFuture
Cela était nécessaire pour qu'il s'affiche "non échappé" pour moi en utilisant le serveur Web Spring, merci!
rogerdpack
20

Avec Jenkins 1.494, j'ai pu envoyer un fichier à un paramètre de tâche sur Ubuntu Linux 12.10 en utilisant curlavec des --formparamètres:

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

Sur le serveur Jenkins, j'ai configuré un travail qui accepte un seul paramètre: un paramètre de téléchargement de fichier nommé myfileparam .

La première ligne de cet appel curl construit un formulaire Web avec un paramètre nommé myfileparam(identique à celui du travail); sa valeur sera le contenu d'un fichier sur le système de fichiers local nommé /local/path/to/your/file.txt. Le @préfixe du symbole indique à curl d'envoyer un fichier local au lieu du nom de fichier donné.

La deuxième ligne définit une demande JSON qui correspond aux paramètres du formulaire sur la première ligne: un paramètre de fichier nommé myfileparam.

La troisième ligne active le bouton Build du formulaire. La quatrième ligne est l'URL du travail avec le suffixe "/ build".

Si cet appel réussit, curl revient 0. S'il échoue, l'erreur ou l'exception du service est imprimée sur la console. Cette réponse prend beaucoup d' un ancien billet de blog concernant Hudson , que j'ai déconstruit et retravaillé pour mes propres besoins.

Steve HHH
la source
6

Voici comment vous pouvez POST XML sur Windows en utilisant la ligne de commande curl sur Windows. Mieux vaut utiliser le fichier batch / .cmd pour cela:

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
la source
Comment formater la chaîne xml avant de l'utiliser avec la commande curl
Chinmoy
3

Si vous avez plusieurs en-têtes, vous pouvez utiliser les éléments suivants:

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

Vous pouvez utiliser cette commande:

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
la source
1

Si vous utilisez curl sous 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
la source