возврат XML-ответа с CURL
Я передаю некоторые параметры через HTTP POST на веб-сервер.
Я получаю ответ, но в идеале я хочу получить полный XML-ответ, тогда как мне кажется, что я получаю только сцепленную строку. Я пробовал SimpleXMLElement, но, похоже, он ничего не делает и не возвращает XML.
$post_string = ' TitleList D12E9CF3-F742-47FC-97CB-295F4488C2FA David '; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"https://jobs.chameleoni.com/PostXML/PostXml.aspx"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "Action=postxml&AuthKey=Guest&AuthPassword=KgwLLm7TL6G6&Xml=$post_string"); // receive server response . curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION,true); $server_output = curl_exec ($ch); echo $server_output." TEST
"; curl_close ($ch); $oXML = new SimpleXMLElement($server_output); foreach($oXML->entry as $oEntry)< echo $oEntry->title . "\n"; >
Вот страница, на которой вы можете даже протестировать POST и XML.
Мой XML, кажется, в порядке, так как он работает на тестовой странице. Я предполагаю, что с моим PHP что-то не так, хотя я понятия не имею, что это такое!
Любая помощь будет прекрасна!
Решение
Ваш код извлекает полный XML, чтобы увидеть его, напишите:
echo htmlentities( $server_output ); die();
Проблема заключается в том, что браузер интерпретирует ваш вывод как HTML, поэтому тег скрыт (см. Исходный код страницы браузера, и вы найдете свой полный XML).
Кроме того, чтобы отправить XML как XML, перед отправкой соответствующих заголовков:
header( 'Content-type: text/xml' ); echo $server_output; die();
Нет другого выхода до и после кода выше, в противном случае ваш XML будет поврежден.
Если вы предпочитаете SimpleXML, вы можете сделать это:
$oXML = new SimpleXMLElement( $server_output ); header( 'Content-type: text/xml' ); echo $oXML->asXML(); die();
Также в этом случае нет выхода до и после (Так прокомментируйте предыдущие строки).
Другие решения
Вам нужно пройти Content-Type заголовок со значением application/x-www-form-urlencoded
Так же xml полезная нагрузка должна быть urlencoded.
Пример с $post_string быть таким же, как в вашем вопросе
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"https://jobs.chameleoni.com/PostXML/PostXml.aspx"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded')); curl_setopt($ch, CURLOPT_POSTFIELDS, "Action=postxml&AuthKey=Guest&AuthPassword=KgwLLm7TL6G6&Xml 1 6 Mr 2 Mrs 3 Miss 4 Ms 5 Dr 43 Sir "
Как ответить клиенту в формате xml в php?
А как вы без echo (или подобного ему) выведете ответ на запрос?
если я выведу ответ через запрос он не с может работать и моим ответом запрос он делать будет через cURL прием его кода
$result = curl_exec($ch);
// завершение сеанса и освобождение ресурсов
curl_close($ch);
$xml = new SimpleXMLElement($result);
если я отвечу через echo он не сможет работать с моим ответом вот в чем проблема
farrukh77: Что, простите? Он к вам так же будет щемиться через curl. Почему вы решили что echo не даст никакого ответа ему? Хэдером перед echo вы говорите тому, кто делает запрос, что сейчас в ответе будет XML.
server.php
header(‘Content-Type: text/xml’);
$name=$_POST[‘name’];
$phone=$_POST[‘phone’];
//получаю данные записываю ответ на базу отправляю ответ в формате xml
$queryup=»INSERT INTO table(`name`,`phone`) VALUES (‘$name’, ‘phone») «;.
теперь я должен ответит на запрос типа да две параметры вот такой xml
if(mysql_query($query))
echo $result =’
//инициализация сеанса
$ch = curl_init();
// установка URL и других необходимых параметров
curl_setopt($ch, CURLOPT_URL, «http://сайт/server.php»);
curl_setopt($ch, CURLOPT_POST, 1); //будет POST
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, ‘name=’. $name.’&phone=’. $phone.);
$result = curl_exec($ch);
// завершение сеанса и освобождение ресурсов
curl_close($ch);
$xml = new SimpleXMLElement($result);
echo $result_id=$xml->RESULT_ID;
но у клиента ничего не выводить ,на ответ
а если делать echo $result; тогда выводить, а клиенту надо вот эти две параметры он записывал в базу
SimpleXMLElement::asXML
Метод asXML задаёт формат данных родительских объектов в версии XML 1.0.
Список параметров
Если указано значение в виде строки ( string ), то функция запишет данные в файл, а не вернёт их.
Возвращаемые значения
Если filename не указан, то функция вернёт строку ( string ) в случае успешного выполнения и false в случае возникновения ошибки. Если параметр указан, то функция вернёт true , если файл будет успешно записан и false в противном случае.
Список изменений
Примеры
Пример #1 Получение XML
$xml = new SimpleXMLElement ( $string );
Результат выполнения данного примера:
asXML также работает с результатами Xpath:
Пример #2 Использование asXML() с результатами SimpleXMLElement::xpath()
// Продолжение примера XML выше.
?php
foreach ( $result as $node ) echo $node -> asXML ();
>
?>
Результат выполнения данного примера:
Смотрите также
User Contributed Notes 2 notes
To prevent asXML from encoding vowels unwantedly, simply use an approriate XML header with encoding in advance.
If you do so, asXML will happily leave your vowels (and the header) entirely untouched.
$sxe = new SimpleXMLElement ( $xmlstr );
?>
$xmlstr and $output are identical now.
The subsequent use of html_entity_decode() (as proposed in the very beginning in another post) has several drawbacks:
1. It is slow
2. It is expensive
3. If there are already encoded arrow brackets or double quotes in your source for instance (as shown in the above example), markup will be broken.
Function asXML decodes special chars like ø, æ and others to æ, ø
To get normal output use without quoting:
$xml = html_entity_decode($xml, ENT_NOQUOTES, ‘UTF-8’);
Как получить xml-запросы и отправить ответ xml в php?
Поэтому мне нужно создать приложение, которое получит запрос xml, и на основании этого мне нужно будет вернуть ответ xml. Я знаю, как отправлять запросы и получать ответ, но я никогда не делал этого по-другому. Я бы послал запрос так:
private function sendRequest($requestXML) < $server = 'http://www.something.com/myapp'; $headers = array( "Content-type: text/xml" ,"Content-length: ".strlen($requestXML) ,"Connection: close" ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $server); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 100); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $requestXML); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $data = curl_exec($ch); if(curl_errno($ch))< print curl_error($ch); echo " something went wrong. try later"; >else < curl_close($ch); >return $data; >
Мой вопрос: какой будет код на принимающей стороне? Как поймать входящий запрос? Благодарю.
Общая идея состоит в том, чтобы прочитать значение POST, проанализировать его как XML, принять на нем бизнес-решение, построить ответ XML в соответствии с API, который вы решили, и записать его в ответ.
$dataPOST = trim(file_get_contents('php://input'));
$xmlData = simplexml_load_string($dataPOST);
Затем вы должны построить XML-строку (или дерево документов, если хотите) и распечатать ее в ответ. print () или echo () сделают все возможное.
Все, что вам нужно сделать на принимающей стороне, – создать «обычный» PHP-скрипт. В зависимости от протокола между конечной точкой и запрашивающей службой вам необходимо получить данные из правильного местоположения, которое, скорее всего, будет массивом $ _GET или $ _POST .
Возможно, вам придется прочитать необработанные данные POST, если они не пройдут через $ _POST, возьмите пик в этой статье