Como evitar que o cURL junte vários valores `--data` por & -symbol?


1

Estou usando o cURL para colocar alguns dados em um servidor Redmine. Eu quero usar várias --data-xxxopções para criar um corpo de solicitação XML válido. O comando é assim:

curl -H "Content-Type: application/xml" \
  -H "X-Redmine-API-Key: $TOKEN" \
  -d "<?xml version=\"1.0\"?><wiki_page><text>" \
  --data-binary "@$FILE" \
  -d "</text></wiki_page>" \
  -X PUT http://some.redmine.site.com/projects/someproj/wiki/test.xml

No entanto, como --dataopção documentada:

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. Assim, o uso -d name=daniel -d skill=lousygeraria um post chunk que se parece name=daniel&skill=lousy.

Compreendo que o designer do cURL faça dessa maneira ajudar a criar um URL com a string de consulta. Mas nessa situação, esses símbolos-e adicionados farão com que meu corpo XML de solicitação esteja malformado. Eu posso acrescentar "nbsp;" para o valor para solucionar isso quando for depois --data. Mas quando se trata do uso misturado com um arquivo ( --data-binary "@$FILE"), não há como resolver isso.


Infelizmente, li atentamente a página de manual e posso dizer que não há opção para alterar ou suprimir o caractere de interconexão. A única maneira de pensar é em completar a concatenação da string antes de enrolar.
Fwonce 10/10

Eu acho que essa pergunta pertence ao StackOverflow .
você

Respostas:


2

Apenas passe tudo como um --datavalor único , então. Existem várias maneiras de fazer isso:

  • Para arquivos curtos, 'inclua' o conteúdo bruto do arquivo no comando:

    curl … -d "<?xml…?><wiki_page><text>$(cat "$FILE")</text></wiki_page>"
    
  • Para arquivos mais longos, crie um arquivo temporário contendo os dados necessários:

    temp=$(mktemp /tmp/redmineXXXXXXXX.xml)
    {
        echo "<?xml…>"
        echo "<wiki_page><text>"
        cat "$FILE"
        echo "</text></wiki_page>"
    } > "$temp"
    curl … -d "@$temp"
    rm -f "$temp"
    

Obrigado @grawity. Sim, há são várias maneiras de fazer isso, de fato e eu vou ter um deles. Últimas palavras: se o cURL deve fornecer uma opção para permitir que os usuários alterem isso? Além do caso que levantei acima, o URI de parâmetro de matriz também envolve ponto e vírgula como separador, e não o e comercial.
Fwonce 11/10

Não, não deveria, porque não-d é para criar URIs - é para criar dados POST . Especificamente, ele gera application/x-www-form-urlencodeddados POST formatados, que sempre são usados &como separador. Embora esse formato seja baseado em cadeias de consulta de URI, não é a mesma coisa.
grawity
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.