Php xml запрос xml ответ

Как сделать post запрос xml?

Следует выполнить POST запрос на добавление нового подписчика из xml и вывести результат (ответное xml).
Как это реализовать? curl?
Прочитал темы по сабжу, но, видимо, не все понял. можно на моем примере пояснить?

POST не может быть безымянным, должно быть поле в котором будут переданы данные, в вашем случае это xml. Не совсем понятна суть, вам надо решить вопрос с какой стороны сервера или клиента апи?

т.е. у меня на сайте стоит форма. в ней поля — Имя, Email и checkbox получать рассылку или нет
если стоит галочка получать рассылку, то в mysite.com/api/
нужно послать xml запрос методом post с текстом (указанным выше)

$ch = curl_init(); $data = array('request' => $xml); curl_setopt($ch, CURLOPT_URL, "http://mysite.com/api/"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $response=curl_exec($ch); curl_close($ch); print_r($response); 
$data = array('request' => $xml,'Content-Type: text/xml; charset=utf-8'); 
$ch = curl_init(); $data = array('Content-Type: text/xml; charset=utf-8'); curl_setopt($ch, CURLOPT_URL, "http://mysite.com/api/api?"+$xml); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $response=curl_exec($ch); curl_close($ch); print_r($response); 
 xxxx AddAndUpdate false 1 aa@aa.aa name  '; $ch = curl_init(); $data = array('Content-Type: text/xml; charset=utf-8'); curl_setopt($ch, CURLOPT_URL, "https://mysite.com/api?"+$xml); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $response=curl_exec($ch); curl_close($ch); print_r($response); ?>

однако, есть пример на c# (asp), реализующий то же самое. Он рабочий.

WebRequest request = WebRequest.Create("https://mysite.com/api"); request.Method = "POST"; string postData = @" xxxx AddAndUpdate false 1 aa@aa.aa name  "; byte[] byteArray = Encoding.UTF8.GetBytes(postData); request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = byteArray.Length; Stream dataStream = request.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); dataStream.Close(); try < WebResponse response = request.GetResponse(); >catch (WebException ex) < // using (Stream data = ex.Response.GetResponseStream()) // < // string text = new StreamReader(data).ReadToEnd(); // Response.Write("

" + text); // > >

и почему-то в мануале написано про контент тайп text/xml, а в примере application/x-www-form-urlencoded

MrBlack, curl_setopt($ch, CURLOPT_POSTFIELDS, $data); замените на curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); , и добавьте curl_setopt($ch, CURLOPT_HTTPHEADER, array($xml);

Источник

Общая структура xml запроса и ответа при использовании api

rss

Проект seo-tools поддерживает xml запросы для предоставления данных.

Полное копирование текстов справки с демонстрационного сайта проекта http://seo-tools.forwebm.net считается полноценным нарушением условий использования проекта seo-tools, в результате чего автоматически Вы лишаетесь обновлений и тех.поддержки. Вы можете использовать приведенные разработчиком на сайте http://seo-tools.forwebm.net тексты справок в качестве основы, но Вы не имеете права копировать их полностью на свои ресурсы.

Адрес для отправки запросов: http://seo-tools.forwebm.net/xml/
Метод запроса: POST
Кодировка запроса: UTF-8

Вид стандартного xml запроса (без указания параметров api для получения конкретных данных)

version=»1.0″ encoding=»UTF-8″?>

кодировка ответа
api код
тип возвращаемых данных

— Указывается кодировка, в которой необходимо возвращать данные, например: windows-1251 или utf-8. Если оставить пустым или вовсе не указать данный тэг — по умолчанию данные будут возвращаться в кодировке UTF-8
Пример:

Читайте также:  Css вывести поверх всех

version=»1.0″ encoding=»UTF-8″?>

windows-1251

— Указывается персональный api код, необходимый для предоставления доступа к api seo-tools. Данный код можно взять со страницы управления api Вашего кабинета.
Пример:

version=»1.0″ encoding=»UTF-8″?>

9b3d80e69fe1a4e0a5df52a3c32b04f2

— Указывает на тип получаемых данных. Ограничено в диапазоне и функционально исключительно в рамках допустимых типов. Типы api приведены в соответствующих записях текущего раздела справки. Например, для получения апдейтов поисковиков используется тип `updates` и т.д. В соответствующих записях справки тип указывается.
Пример:

version=»1.0″ encoding=»UTF-8″?>

updates

Существует еще один тэг, который учитывается при составлении запроса:
— Данный тэг не обязательный. Используется для возможности получения описания ошибки в случае её возникновения (текст ошибки возвращается на английском языке). По умолчанию в случае ошибки возвращается только код ошибки (см. ниже по тексту), для получения +описания ошибки необходимо добавить в тело запроса тэг со значением 1.
Пример:

version=»1.0″ encoding=»UTF-8″?>

1

Описаны стандартные поля для составления запроса. В зависимости от типа запроса могут добавляться другие поля к уже описанным выше (все дополнительные поля описываются в соответствующей типу api справке).

Пример отправки xml запроса средствами php используя библиотеку cURL
Пример:

function PostXML ( $link , $xml ) <
$chx = curl_init ();
curl_setopt ( $chx , CURLOPT_URL , $link );
curl_setopt ( $chx , CURLOPT_TIMEOUT , 90 );
curl_setopt ( $chx , CURLOPT_RETURNTRANSFER , 1 );
curl_setopt ( $chx , CURLOPT_USERAGENT , $_SERVER [ «HTTP_USER_AGENT» ]);
curl_setopt ( $chx , CURLOPT_POST , 1 );
curl_setopt ( $chx , CURLOPT_POSTFIELDS , $xml );
$result = curl_exec ( $chx );
curl_close ( $chx );
return $result ;
>

$respons = PostXML ( ‘http://seo-tools.forwebm.net/xml/’ , $xml );

/* переменная $respons будет содержать xml ответ описанный выше
по тексту в кодировке windows-1251 (указана при составлении запроса) */

Вид стандартного xml ответа (пустой):
Пример:

version="1.0" encoding="кодировка"?>
version="1.3.3">

кодировка
и остальные тэги, отправленные в запросе





результат взависимости от типа api

— Содержит текущую дату и время запроса в формате: Y-m-d H:i:s
— Содержит хост сайта проекта (т.е seo-tools.forwebm.net)
— Содержит логин пользователя, чей api код был использован для подачи запроса. Может отсутствовать в случае возникновения ошибки составления запроса.
Пример:

version=»1.0″ encoding=»WINDOWS-1251″?>
version=»1.3.3″>


2011-09-06 21:20:27
seo-tools.forwebm.net
admin

— Содержит вложенную xml структуру ответа в зависимости от типа api (в справке соответствующего типа api структура подробно описывается, см. необходимый тип api)

В случае, если возникает какая-либо ошибка — тэг results будет отсутствовать, но появится тэг errorcode, который будет содержать код ошибки.

1 — Пустой xml запрос
2 — Отправлен некорректный запрос
3 — Не указан hash код пользователя
4 — Не определен тип возвращаемых xml данных
5 — Неизвестный тип возвращаемых xml данных
6 — Api недоступен или отключен администратором
7 — Неверный hash код пользователя
8 — Аккаунт не поддерживает xml api
9 — Вы исчерпали дневной лимит запросов для используемого типа api
10 — На Вашем счете недостаточно средств для выполнения запросов
11 — Произошла ошибка при оплате выполнения запросов

В данном списке приведен `стандартный` список ошибок при составлении и идентификации запроса. Описание кодов ошибок определенных типов описывается в соответствующем типу api разделе справки.

Если в запрос был включен тэг 1, в таком случае к ответу также будет добавлен тэг error, содержащий описание ошибки (на английском языке).
Пример:

version="1.0" encoding="WINDOWS-1251"?>
version="1.3.3">

WINDOWS-1251
9b3d80e69fe1a4e0a5df52a3c32b04f2
updates
1

2011-09-06 21:20:27
seo-tools.forwebm.net
admin
8
Account does not support xml api

Источник

Как получить 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, возьмите пик в этой статье

Источник

XML Запрос и ответ php

kvins вне форума

Подскажите пожалуйста как правильно делать запрос в xml формате и куда при этом будет приходить ответ, на тот же файл ?

Мне нужно подключится к api
Запрос отправляется к http://orders.novaposhta.ua/xml.php

Пример


Ваш ключ API

Полтава
Киев
20
10
5
10 1001
4
19.01.2012

Чем отправлять запрос, нужно использовать curl_init() ??
Я так понял что получить ответ можно через simplexml_load_file(«»); , а вот как сначала дать запрос я запутался

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

2 И чтобы все это было без перезагрузки нужен аякс или просто запрос делать при загрузке страницы ?

OKyJIucT вне форума

Sunshine reggae

  • Регистрация: 02.09.2011
  • Сообщений: 3,240
  • Репутация: 1830
  • Webmoney BL: ?

kvins, выдрал из одного скрипта для работы с потоковым видео, но суть та же

// build xml $xml = '  Ваш ключ API Полтава Киев 20 10 5 10 100 1 4 19.01.2012  '; // отправляем запрос - $responce сохраняет ответ $response = http_post_curl('text/xml', $xml); if($response === FALSE) < return FALSE; >function http_post_curl($content_type, $post_data) < $url = 'http://orders.novaposhta.ua/xml.php'; // init curl $curl = curl_init($url); if(!$curl) < $this->_add_error('Failed to init cURL'); return FALSE; > // curl options curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($curl, CURLOPT_TIMEOUT, 30); curl_setopt($curl, CURLOPT_FAILONERROR, TRUE); curl_setopt($curl, CURLOPT_POST, TRUE); $http_headers = array( 'Content-type: ' . $content_type ); curl_setopt($curl, CURLOPT_HTTPHEADER, $http_headers); curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data); $response = curl_exec($curl); if($response === FALSE) < return FALSE; >return $response; >

В том же файле разбирается ответ функцией simplexml_load_string

Вот код функции разбора, не охота ковырять под вашу задачу, сами как нибудь 🙂

function _parse_response($response) < $status = ''; $error_code = 0; $error = ''; $content_uid = ''; if(function_exists('domxml_open_mem')) < // load XML $doc = domxml_open_mem($response); if( ! $doc) < $this->_add_error('Failed to parse XML: ' . $response); return FALSE; > // find $list = $doc->get_elements_by_tagname('status'); if(count($list) == 0) < $this->_add_error('Unable to find in response: ' . $response); return FALSE; > $elem_status = $list[0]; // get value if($elem_status->has_child_nodes()) < $text_node = $elem_status->first_child(); if($text_node->type == XML_TEXT_NODE) < $status = $text_node->content; > > // check 'errorCode' and 'error' attributes if($elem_status->has_attribute("error")) < $error = $elem_status->get_attribute("error"); > if($elem_status->has_attribute("errorCode")) < $error_code = $elem_status->get_attribute("errorCode"); > // find $list = $doc->get_elements_by_tagname('id'); if(count($list) != 0) < $elem_id = $list[0]; // get value if($elem_id->has_child_nodes()) < $text_node = $elem_id->first_child(); if($text_node->type == XML_TEXT_NODE) < $content_uid = $text_node->content; > > > > elseif(function_exists('simplexml_load_string')) < // load XML $doc = simplexml_load_string($response); if( ! $doc) < $this->_add_error('Failed to parse XML: ' . $response); return FALSE; > // find if( ! isset($doc->status)) < $this->_add_error('Unable to find in response: ' . $response); return FALSE; > $elem_status = $doc->status; $attributes = $elem_status->attributes(); // get value $status = (string)$doc->status; // check 'errorCode' and 'error' attributes if(isset($attributes['error'])) < $error = (string)$attributes['error']; >if(isset($attributes['errorCode'])) < $error_code = (string)$attributes['errorCode']; >// find if(isset($doc->id)) < // get value $content_uid = (string)$doc->id; > > else < $this->_add_error('Cannot parse response from server: XML library must be installed'); return FALSE; > // return depending on status if($status == 'accepted') < if(strlen($content_uid) == 0) < $this->_add_error('Empty content id in response: ' . $response); return FALSE; > return $content_uid; > elseif($status == 'failed') < $this->_add_error('Response failed: errorCode=' . $error_code . ' error=' . $error); return FALSE; > else < $this->_add_error('Unknown status (' . $status . ') in response: ' . $response); return FALSE; > >

Источник

Оцените статью