PHP, Как мне получить чистый XML POST-контент в переменную? - PullRequest
0 голосов
/ 15 сентября 2009

Я написал скрипт PHP, который отправляет XML на мой сервер:

$xml_request='<?xml version="1.0"?><request><data></data></request>';
$url='http://www.myserver.com/xml_request.php';

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 4); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_request); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: close'));

$result = curl_exec($ch); 

curl_close($ch);

Я пытаюсь выяснить, как проанализировать этот запрос на стороне сервера. Если я сделаю это:

print_r($_POST);

Возвращает:

Array
(
    [<?xml_version] => \"1.0\"?><request><data></data></request>
)

Я хочу иметь возможность передать сообщение в один из анализаторов XML. Например simplexml_load_string(). Мне нужен доступ к чистому XML-файлу. Как получить доступ к запросу POST, чтобы получить чистый файл?

Ответы [ 2 ]

2 голосов
/ 15 сентября 2009

Проблема со скриптом, который отправляет запрос. Вам необходимо закодировать строку XML перед отправкой на сервер, чтобы сервер не мог ее проанализировать. Попробуйте запустить XML через rawurlencode, прежде чем публиковать его на сервере.

<ч />

Глядя на это больше, я увидел еще одну проблему. Похоже, опция CURLOPT_POSTFIELDS ожидает, что вы сформируете строку самостоятельно. Quoth страница руководства (жирный шрифт мой):

Полные данные для отправки в HTTP-операции «POST». Чтобы опубликовать файл, добавьте @ к имени файла и используйте полный путь. Это может быть передано в виде строки в кодировке urlen, например 'para1 = val1 & para2 = val2 & ...', или в виде массива с именем поля в качестве ключа и данными поля в качестве значения. Если значение является массивом, Content -Тип заголовка будет установлен в multipart / form-data.

Так что в вашем случае это было бы что-то вроде

curl_setopt($ch, CURLOPT_POSTFIELDS, 'xmlstring='.rawurlencode($xml_request))

И тогда в вашем принимающем скрипте вы ожидаете, что сможете получить к нему доступ как $ _POST ['xmlstring'].

0 голосов
/ 08 августа 2014

php://input позволяет читать необработанные данные POST в PHP.

Например:

На стороне клиента:

<?php
$ch = curl_init();
$file = file_get_contents("stuff.xml");
$url = "http://traalala.com/foobar";
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$file);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
curl_setopt($ch,CURLOPT_TIMEOUT, 20);
$response = curl_exec($ch);
print "curl response is:" . $response;
curl_close ($ch);
?>

В контроллере на стороне сервера:

$post = file_get_contents("php://input");
print $post;

Запуская сообщение, контроллер захватывает данные сообщения.

Вы получаете чистый вывод XML, напечатанный на экране, как определено в stuff.xml

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...