#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 .