enviar / publicar arquivo xml usando a linha de comando curl

389

Como posso enviar / publicar um arquivo xml em um servidor local http: // localhost: 8080 usando curl na linha de comando?

Que comando devo usar?

Arnab Sen Gupta
fonte

Respostas:

507

Se essa pergunta estiver conectada às outras perguntas do Hudson, use o comando que elas fornecem. Dessa forma, com o XML na linha de comando:

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

Você precisa alterá-lo um pouco para ler um arquivo:

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

Leia a página de manual . seguindo um resumo para -d Parameter.

-d / - dados

(HTTP) Envia os dados especificados em uma solicitação POST para o servidor HTTP, da mesma forma que um navegador quando um usuário preencheu um formulário HTML e pressiona o botão Enviar. Isso fará com que o curl transmita os dados para o servidor usando o aplicativo do tipo de conteúdo / x-www-form-urlencoded. Compare com o formulário -F / -.

-d / - dados são os mesmos que --data-ascii. Para postar dados puramente binários, você deve usar a opção --data-binary. Para codificar por URL o valor de um campo de formulário, você pode usar --data-urlencode.

Se qualquer uma dessas opções for usada mais de uma vez na mesma linha de comando, as partes de dados especificadas serão mescladas com um símbolo & de separação. Portanto, o uso de '-d name = daniel -d skill = péssimo' geraria um pedaço de postagem semelhante a 'name = daniel & skill = péssimo'.

Se você iniciar os dados com a letra @, o restante deverá ser um nome de arquivo para o qual ler os dados ou - se desejar que o curl leia os dados do stdin. O conteúdo do arquivo já deve estar codificado em URL. Vários arquivos também podem ser especificados. A publicação de dados de um arquivo chamado 'foobar' seria feita com --data @foobar.

Peter Schuetze
fonte
2
Leia a página de manual. The contents of the file must already be URL-encoded.Os arquivos XML do OP certamente não são.
Coronel Panic
52
Contanto que você especifique o tipo de conteúdo --header "Content-Type:application/xml"que não são esperados para URL-codificar
Coronel Pânico
12
Vou acrescentar que, se você usar "-d", o padrão será POST, portanto, não será necessário usar "-X" também.
Tal Liron
4
se você estiver usando a opção seguir redirecionamentos do curl -L, não use, -X POSTpois ele fará com que a solicitação redirecionada use POST também. Se você usar apenas -d como @Tai sugere, isso não vai acontecer
Tristan Havelick
18
Esteja avisado de que -dretira as quebras de linha dos arquivos. Para evitar isso, use em seu --data-binarylugar.
22815 Yar
189

Na página de manual , acredito que estes são os dróides que você está procurando:

-F/--form <name=content>

(HTTP) Isso permite ondular emular um formulário preenchido no qual um usuário pressionou o botão enviar. Isso causa ondulação nos dados do POST usando o multipart do tipo de conteúdo / dados do formulário de acordo com a RFC2388. Isso permite o upload de arquivos binários, etc. Para forçar a parte 'content' a ser um arquivo, prefixe o nome do arquivo com um sinal @.

Exemplo, para enviar seu arquivo de senha para o servidor, em que 'senha' é o nome do campo de formulário no qual / etc / passwd será a entrada:

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

Então, no seu caso, isso seria algo como
curl -F file=@/some/file/on/your/local/disk http://localhost:8080

Piskvor saiu do prédio
fonte
11
Esta solução tem o benefício adicional de poder nomear o arquivo que está sendo enviado (diferente da solução escolhida acima) e, portanto, você pode, por exemplo, enviar vários arquivos.
David Cairns
13
O formato file=@-é útil se você quiser tubo de seu arquivo no.
Steven Lu
2
Caso alguém esteja procurando enviar um arquivo e outras informações: use -F key = val -F key = val quantas vezes for necessário. A inclusão de todos os parâmetros de postagem em uma cadeia grande separada por & não funciona.
hgolov
Você pode mencionar como preparar a página da Web de recebimento para poder receber os arquivos enviados via curl no desktop?
SexyBeast
@Cupidvogel: Como qualquer outro campo de upload de arquivo; não há manuseio especial especificamente para enrolar.
Piskvor saiu do prédio
47

Você pode usar a opção --data com o arquivo

Grave o conteúdo xml em um arquivo chamado soap_get.xml e use o comando curl para enviar a solicitação:

curl -X POST --header "Tipo de conteúdo: text / xml; charset = UTF-8" --data @ soap_get.xml your_url

NgaNguyenDuy
fonte
Essa deve ser a resposta, pois o OP está perguntando sobre a postagem de um arquivo que não seja texto embutido.
FearlessFuture
Isso foi necessário para que ele aparecesse "não escapou" para mim usando o servidor web do spring, obrigado!
Rogerdpack #
20

Com o Jenkins 1.494, consegui enviar um arquivo para um parâmetro de trabalho no Ubuntu Linux 12.10 usando curlcom os --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

No servidor Jenkins, configurei um trabalho que aceita um único parâmetro: um parâmetro de upload de arquivo chamado myfileparam.

A primeira linha dessa chamada curl constrói um formulário da Web com um parâmetro chamado myfileparam(o mesmo que no trabalho); seu valor será o conteúdo de um arquivo no sistema de arquivos local chamado /local/path/to/your/file.txt. O @prefixo do símbolo diz ao curl para enviar um arquivo local em vez do nome do arquivo especificado.

A segunda linha define uma solicitação JSON que corresponde aos parâmetros do formulário na linha um: um parâmetro de arquivo nomeado myfileparam.

A terceira linha ativa o botão Compilar do formulário. A quarta linha é a URL do trabalho com o sufixo "/ build".

Se esta chamada for bem-sucedida, a curvatura retornará 0. Se não der certo, o erro ou exceção do serviço é impresso no console. Essa resposta leva muito de um post antigo relacionado ao Hudson , que eu desconstruí e retrabalhei para minhas próprias necessidades.

Steve HHH
fonte
6

Veja como você pode POST XML no Windows usando a linha de comando curl no Windows. Melhor usar o arquivo batch / .cmd para isso:

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
fonte
Como u formatar a cadeia de caracteres XML antes de usar com comando curl
Chinmoy
3

Se você tiver vários cabeçalhos, poderá usar o seguinte:

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

Você pode 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
fonte
1

Se você estiver usando curl no 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
fonte