Como evitar que cURL associe múltiplos valores '--data' por & -symbol?

1

Estou usando o cURL para colocar alguns dados em um servidor Redmine. Desejo usar várias opções --data-xxx 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 --data opção documentada:

If any of these options is used more than once on the same command line, the data pieces specified will be merged together with a separating &-symbol. Thus, using -d name=daniel -d skill=lousy would generate a post chunk that looks like name=daniel&skill=lousy.

Eu posso entender que o designer do cURL faz desse jeito para ajudar a construir um URL com uma string de consulta. Mas, nessa situação, esses & -símbolos adicionados farão com que meu corpo XML de solicitação seja malformado. Posso prefixar "nbsp;" para o valor para solucionar isso quando estiver após --data . Mas quando se trata do uso misturado com um arquivo ( --data-binary "@$FILE" ), não há como resolver isso.

    
por fwonce 10.10.2016 / 11:09

1 resposta

2

Apenas passe tudo como um único valor --data , 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 maiores, 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"
    
por 10.10.2016 / 15:12