1

Я использую cURL, чтобы поместить некоторые данные на сервер Redmine. Я хочу использовать несколько опций --data-xxx для создания правильного тела запроса XML. Команда выглядит так:

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

Однако, как опция --data задокументирована:

Если какой-либо из этих параметров используется более одного раза в одной и той же командной строке, указанные фрагменты данных будут объединены с разделительным символом & -symbol. Таким образом, использование -d name=daniel -d skill=lousy приведет к созданию пост-чанка, который выглядит как name=daniel&skill=lousy .

Я могу понять, что разработчик cURL сделал это таким образом, чтобы помочь создать URL со строкой запроса. Но в этой ситуации эти добавленные символы-& будут искажать тело XML моего запроса. Я могу предвосхитить "nbsp;" к значению, чтобы обойти это, когда это после --data . Но когда дело доходит до использования, смешанного с файлом (--data-binary "@$FILE"), нет никакого способа решить это.

1 ответ1

2

Тогда просто передайте все как одно значение --data . Есть несколько способов сделать это:

  • Для коротких файлов включите необработанное содержимое файла в команду:

    curl … -d "<?xml…?><wiki_page><text>$(cat "$FILE")</text></wiki_page>"
    
  • Для более длинных файлов создайте временный файл, содержащий необходимые данные:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .