enviar / publicar archivo xml usando la línea de comando curl

Respuestas:

507

Si esa pregunta está conectada con sus otras preguntas de Hudson, use el comando que proporcionan. De esta manera con XML desde la línea de comando:

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

Debe cambiarlo un poco para leerlo desde un archivo:

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

Lee la página del manual . siguiendo un resumen para el parámetro -d.

-d / - datos

(HTTP) Envía los datos especificados en una solicitud POST al servidor HTTP, de la misma manera que lo hace un navegador cuando un usuario ha completado un formulario HTML y presiona el botón Enviar. Esto hará que curl pase los datos al servidor utilizando la aplicación de tipo de contenido / x-www-form-urlencoded. Compare con el formulario -F / -.

-d / - los datos son los mismos que --data-ascii. Para publicar datos puramente binarios, debería usar la opción --data-binary. Para codificar en URL el valor de un campo de formulario, puede usar --data-urlencode.

Si alguna de estas opciones se usa más de una vez en la misma línea de comando, las piezas de datos especificadas se fusionarán con un símbolo de separación &. Por lo tanto, el uso de '-d name = daniel -d skill = lousy' generaría un fragmento de publicación similar a 'name = daniel & skill = lousy'.

Si comienza los datos con la letra @, el resto debe ser un nombre de archivo para leer los datos o, si desea que curl lea los datos de stdin. El contenido del archivo ya debe estar codificado en URL. También se pueden especificar varios archivos. Por lo tanto, publicar datos de un archivo llamado 'foobar' se haría con --data @foobar.

Peter Schuetze
fuente
2
Lee la página del manual. The contents of the file must already be URL-encoded.Los archivos XML de OP seguramente no lo son.
Coronel Panic
52
Siempre y cuando especifique el tipo de contenido --header "Content-Type:application/xml"que no se espera que codifique
Colonel Panic
12
Solo agregaré que si usa "-d", el valor predeterminado es POST, por lo que no es necesario usar "-X" también.
Tal Liron
44
si está utilizando la opción de seguir redireccionamientos de curl -L, no la use -X POSTya que hará que la solicitud redirigida use POST también. Si solo usas -d como sugiere @Tai, esto no sucederá
Tristan Havelick
18
Tenga en cuenta que las -dtiras saltos de línea de los archivos. Para evitar esto, use --data-binaryen su lugar.
Yar
189

Desde la página de manual , creo que estos son los droides que estás buscando:

-F/--form <name=content>

(HTTP) Esto permite que el rizo emule un formulario rellenado en el que un usuario ha presionado el botón Enviar. Esto hace que los datos de POST se doblen usando el multiparte / tipo de contenido de datos de acuerdo con RFC2388. Esto permite cargar archivos binarios, etc. Para forzar que la parte de "contenido" sea un archivo, prefije el nombre del archivo con un signo @.

Ejemplo, para enviar su archivo de contraseña al servidor, donde 'contraseña' es el nombre del campo de formulario al que / etc / passwd será la entrada:

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

Entonces, en su caso, esto sería algo así como
curl -F file=@/some/file/on/your/local/disk http://localhost:8080

Piskvor salió del edificio
fuente
11
Esta solución tiene el beneficio adicional de poder nombrar el archivo que se envía (a diferencia de la solución elegida anteriormente) y, por lo tanto, puede enviar, por ejemplo, múltiples archivos.
David Cairns
13
El formato file=@-es útil si desea canalizar su archivo.
Steven Lu
2
En caso de que alguien quiera enviar un archivo y otra información: use -F clave = val -F clave = val tantas veces como sea necesario. El encerrar todos los parámetros de publicación en una cadena grande separada por & no funciona.
hgolov
¿Puede mencionar cómo preparar la página web receptora para poder recibir los archivos cargados mediante curl desde el escritorio?
SexyBeast
@Cupidvogel: como cualquier otro campo de carga de archivos; No hay un manejo especial específicamente para el rizo.
Piskvor salió del edificio
47

Puede usar la opción --data con archivo.

Escriba contenido xml en un archivo llamado es soap_get.xml y use el comando curl para enviar la solicitud:

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

NgaNguyenDuy
fuente
Esta debería ser la respuesta ya que el OP pregunta sobre publicar un archivo que no sea texto en línea.
FearlessFuture
Esto fue necesario para que apareciera "no escapado" para mí usando el servidor web Spring, ¡gracias!
rogerdpack
20

Con 1.494 Jenkins, yo era capaz de enviar un archivo a un parámetro de trabajo en Ubuntu Linux 12.10 utilizar curlcon --formparámetros:

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

En el servidor Jenkins, configuré un trabajo que acepta un solo parámetro: un parámetro de carga de archivo llamado myfileparam .

La primera línea de esa llamada curl construye un formulario web con un parámetro llamado myfileparam(igual que en el trabajo); su valor será el contenido de un archivo en el sistema de archivos local llamado /local/path/to/your/file.txt. los@ prefijo del símbolo le dice a curl que envíe un archivo local en lugar del nombre de archivo dado.

La segunda línea define una solicitud JSON que coincide con los parámetros del formulario en la línea uno: un parámetro de archivo llamado myfileparam.

La tercera línea activa el botón Construir del formulario. La cuarta línea es la URL del trabajo con el sufijo "/ build".

Si esta llamada es exitosa, regresa curl 0. Si no tiene éxito, el error o la excepción del servicio se imprime en la consola. Esta respuesta toma mucho de una vieja publicación de blog relacionada con Hudson , que deconstruí y volví a trabajar para mis propias necesidades.

Steve HHH
fuente
6

Aquí le mostramos cómo puede POSTAR XML en Windows usando la línea de comando curl en Windows. Mejor use el archivo por lotes / .cmd para eso:

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
fuente
¿Cómo formatear la cadena xml antes de usar con el comando curl
Chinmoy
3

Si tiene varios encabezados, puede utilizar lo siguiente:

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

Puedes usar este 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 
Musleh Uddin
fuente
1

Si está utilizando curl en 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
fuente