Запрос Curl повреждает данные XML Post

#php #xml #curl

#php #xml #curl

Вопрос:

Я отправляю XML-данные в виде POST-запроса с помощью curl на сервер следующим образом:

     // $params contains xslt="<xml version ...."
    $url = get_cfg_var('Http_Host') . "/webservice/update.php?";
    $strParameters = http_build_query($params);

    $ch = curl_init($url);
    // Set options
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $strParameters);
    $data = curl_exec($ch);
  

Теперь, когда я получаю данные в webserive/update.php

$_REQUEST['xslt'] содержит только некоторые конечные данные из xml с удалением большинства тегов таким образом [но с большим количеством новых строк]

  USD

  ,
  .


  0 
  5
  

Я в недоумении, чтобы понять, что происходит. Это какая-то проблема с двойным кодированием?

strParameters содержит правильные данные в формате form-urlencoded [ для пробелов и т. Д.]

Я попробовал urldecode перед отправкой его в curl. но это все равно не решает проблему.

Комментарии:

1. Если вы посмотрите на эти данные в браузере, я бы сказал: неудивительно. Это XML, и браузер скроет все теги, которые он не знает. Возможно, вы ищете htmlspecialchars в этом случае.

2. Нет — я не просматриваю эти данные в браузере. Я просто сбросил _REQUEST[‘xslt’] в файл на стороне сервера.

3. Я не вижу ошибки в вашем коде. Метод выглядит хорошо. Ваш сервер может изменить данные. Вы можете попробовать base64 кодировать данные и снова декодировать их в скрипте и проверить, проходит ли он тогда.

4. Можете ли вы использовать анализатор пакетов или другой подобный инструмент, чтобы увидеть, как выглядит запрос в сети до получения на сервере?

5. @hakre — да, это именно то, что я сделал сейчас [и это работает]. $ params[‘xslt’]= base64_encode(gzcompress($params[‘xslt’], 9)); Тем не менее, я хочу понять, что здесь происходит. Это очень странно.

Ответ №1:

Это скорее комментарий, чем конкретное решение, но я бы подумал об использовании метода array вместо кодирования вашего собственного:

Вам не нужно самостоятельно кодировать post-данные. Вы можете напрямую использовать массив, см.:

CURLOPT_POSTПОЛЯЕТ полные данные для публикации в HTTP-операции «POST». […] Этот параметр может быть передан либо как строка с URL-кодом, например ‘para1= val1amp;para2= val2amp;…’ *, либо как массив с именем поля в качестве ключа и данными поля в качестве значения. Если значение является массивом, заголовку Content-Type будет присвоено значение multipart / form-data .