Intereting Posts

PHP-запрос HTTP SOAP

Несмотря на то, что я разработчик PHP некоторое время, я сейчас получаю свой первый вкус от веб-сервисов. Я надеялся немного помочь, поскольку книга, которую я использую, не очень помогает. Одна из компаний, с которыми мы работаем, дала мне XML-документ в том формате, в котором вы должны быть (я выложу его кусок). Из-за моей неопытности в этом конкретном предмете я не совсем уверен, что делать. Мне нужно знать, как отправить это сообщение на свою страницу POST, как получить ответ, и мне нужно создать любую страницу WSDL? Любая помощь или руководство были бы очень благодарны, и, пожалуйста, не просто отправляйте ссылку на руководство по php. Я, очевидно, был там, поскольку это, как правило, подходит для помощи.

POST /sample/order.asmx HTTP/1.1 Host: orders.sample.com Content-Type: application/soap+xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> <soap12:Header> <AuthenticationHeader xmlns="http://sample/"> <Username>string</Username> <Password>string</Password> </AuthenticationHeader> <DebugHeader xmlns="http://sample/"> <Debug>boolean</Debug> <Request>string</Request> </DebugHeader> </soap12:Header> <soap12:Body> <AddOrder xmlns="http://sample/"> <order> <Header> <ID>string</ID> <EntryDate>dateTime</EntryDate> <OrderEntryView> <SeqID>int</SeqID> <Description>string</Description> </OrderEntryView> <ReferenceNumber>string</ReferenceNumber> <PONumber>string</PONumber> <Comments>string</Comments> <IpAddress>string</IpAddress> </Header> </order> </AddOrder> </soap12:Body> </soap12:Envelope> 

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

У вас есть пара вариантов! Вы можете использовать мыльные объекты для создания запроса, который на основе WSDL будет знать правильный способ поговорить с удаленным сервером. Вы можете увидеть, как это сделать в руководстве по PHP .

Кроме того, вы можете использовать CURL для выполнения этой работы. Вам нужно будет знать, где разместить данные (как это выглядит в приведенном выше примере), тогда вы можете просто сделать что-то вроде этого:

 $curlData = "<?xml version="1.0" encoding="utf-8"?>... etc"; $url='http://wherever.com/service/'; $curl = curl_init(); curl_setopt ($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl,CURLOPT_TIMEOUT,120); curl_setopt($curl,CURLOPT_ENCODING,'gzip'); curl_setopt($curl,CURLOPT_HTTPHEADER,array ( 'SOAPAction:""', 'Content-Type: text/xml; charset=utf-8', )); curl_setopt ($curl, CURLOPT_POST, 1); curl_setopt ($curl, CURLOPT_POSTFIELDS, $curlData); $result = curl_exec($curl); curl_close ($curl); 

Затем вы должны получить результат в $ result var. Затем вы можете попытаться преобразовать его в документ XML, хотя иногда я обнаружил, что из-за кодировки это не работает:

 $xml = new SimpleXMLElement($result); print_r($xml); 

Как поставщик услуги, другая компания должна предоставить вам документ WSDL, который описывает эту услугу на машиночитаемых условиях. Обычно они предоставляются через URL-адрес, например http: //their.service.url/wsdl или аналогичный.

После этого вы сможете создать экземпляр SoapClient для взаимодействия с сервисом.

Ну, это, безусловно, SOAP-запрос, поэтому вам нужно будет использовать SOAP для правильной работы с этим или у вас есть основная головная боль.

У меня было несколько встреч с SOAP и PHP, и каждый раз мне приходилось полагаться на внешнюю библиотеку. Самый последний, который я должен был использовать, – Zend_Soap_Client.

Но опять же, у вас есть WSDL? Для использования веб-службы SOAP с использованием клиентской библиотеки необходим WSDL.

http://framework.zend.com/manual/en/zend.soap.html

И вот пример моего кода, который я использовал, я надеюсь, что он заставит вас начать

 ini_set('soap.wsdl_cache_enabled', 0); set_include_path(dirname(__FILE__).'/../../libraries/:'.get_include_path()); require_once 'Zend/Loader/Autoloader.php'; Zend_Loader_Autoloader::getInstance(); //Include the classes for the webservice include('CatalogOrder.php'); include('CatalogOrderItem.php'); include('CatalogOrderWebservice.php'); //Check the mode if(isset($_GET['wsdl'])) { $autodiscover = new Zend_Soap_AutoDiscover(array( 'classmap' => array( 'CatalogOrder' => "CatalogOrder", 'CatalogOrderItem' => "CatalogOrderItem" ) )); $autodiscover->setComplexTypeStrategy(new Zend_Soap_Wsdl_Strategy_ArrayOfTypeComplex()); $autodiscover->setClass('CatalogOrderWebService'); $autodiscover->handle(); //Return the consume form and process the actions of the consumer } elseif(isset($_GET['consume'])) { // pointing to the current file here $soap = new Zend_Soap_Client("http://".$_SERVER['HTTP_HOST']."/admin/export/WebService.php?wsdl", array( 'classmap' => array( 'CatalogOrder' => "CatalogOrder", 'CatalogOrderItem' => "CatalogOrderItem" ), 'encoding' => 'iso-8859-1' )); include('CatalogOrderWebserviceConsumer.php'); //Process SOAP requests } else { // pointing to the current file here $soap = new Zend_Soap_Server("http://".$_SERVER['HTTP_HOST']."/admin/export/WebService.php?wsdl", array( 'classmap' => array( 'CatalogOrder' => "CatalogOrder", 'CatalogOrderItem' => "CatalogOrderItem" ), 'encoding' => 'iso-8859-1' )); $soap->setClass('CatalogOrderWebService'); $soap->handle(); } в ini_set('soap.wsdl_cache_enabled', 0); set_include_path(dirname(__FILE__).'/../../libraries/:'.get_include_path()); require_once 'Zend/Loader/Autoloader.php'; Zend_Loader_Autoloader::getInstance(); //Include the classes for the webservice include('CatalogOrder.php'); include('CatalogOrderItem.php'); include('CatalogOrderWebservice.php'); //Check the mode if(isset($_GET['wsdl'])) { $autodiscover = new Zend_Soap_AutoDiscover(array( 'classmap' => array( 'CatalogOrder' => "CatalogOrder", 'CatalogOrderItem' => "CatalogOrderItem" ) )); $autodiscover->setComplexTypeStrategy(new Zend_Soap_Wsdl_Strategy_ArrayOfTypeComplex()); $autodiscover->setClass('CatalogOrderWebService'); $autodiscover->handle(); //Return the consume form and process the actions of the consumer } elseif(isset($_GET['consume'])) { // pointing to the current file here $soap = new Zend_Soap_Client("http://".$_SERVER['HTTP_HOST']."/admin/export/WebService.php?wsdl", array( 'classmap' => array( 'CatalogOrder' => "CatalogOrder", 'CatalogOrderItem' => "CatalogOrderItem" ), 'encoding' => 'iso-8859-1' )); include('CatalogOrderWebserviceConsumer.php'); //Process SOAP requests } else { // pointing to the current file here $soap = new Zend_Soap_Server("http://".$_SERVER['HTTP_HOST']."/admin/export/WebService.php?wsdl", array( 'classmap' => array( 'CatalogOrder' => "CatalogOrder", 'CatalogOrderItem' => "CatalogOrderItem" ), 'encoding' => 'iso-8859-1' )); $soap->setClass('CatalogOrderWebService'); $soap->handle(); } в ini_set('soap.wsdl_cache_enabled', 0); set_include_path(dirname(__FILE__).'/../../libraries/:'.get_include_path()); require_once 'Zend/Loader/Autoloader.php'; Zend_Loader_Autoloader::getInstance(); //Include the classes for the webservice include('CatalogOrder.php'); include('CatalogOrderItem.php'); include('CatalogOrderWebservice.php'); //Check the mode if(isset($_GET['wsdl'])) { $autodiscover = new Zend_Soap_AutoDiscover(array( 'classmap' => array( 'CatalogOrder' => "CatalogOrder", 'CatalogOrderItem' => "CatalogOrderItem" ) )); $autodiscover->setComplexTypeStrategy(new Zend_Soap_Wsdl_Strategy_ArrayOfTypeComplex()); $autodiscover->setClass('CatalogOrderWebService'); $autodiscover->handle(); //Return the consume form and process the actions of the consumer } elseif(isset($_GET['consume'])) { // pointing to the current file here $soap = new Zend_Soap_Client("http://".$_SERVER['HTTP_HOST']."/admin/export/WebService.php?wsdl", array( 'classmap' => array( 'CatalogOrder' => "CatalogOrder", 'CatalogOrderItem' => "CatalogOrderItem" ), 'encoding' => 'iso-8859-1' )); include('CatalogOrderWebserviceConsumer.php'); //Process SOAP requests } else { // pointing to the current file here $soap = new Zend_Soap_Server("http://".$_SERVER['HTTP_HOST']."/admin/export/WebService.php?wsdl", array( 'classmap' => array( 'CatalogOrder' => "CatalogOrder", 'CatalogOrderItem' => "CatalogOrderItem" ), 'encoding' => 'iso-8859-1' )); $soap->setClass('CatalogOrderWebService'); $soap->handle(); } в ini_set('soap.wsdl_cache_enabled', 0); set_include_path(dirname(__FILE__).'/../../libraries/:'.get_include_path()); require_once 'Zend/Loader/Autoloader.php'; Zend_Loader_Autoloader::getInstance(); //Include the classes for the webservice include('CatalogOrder.php'); include('CatalogOrderItem.php'); include('CatalogOrderWebservice.php'); //Check the mode if(isset($_GET['wsdl'])) { $autodiscover = new Zend_Soap_AutoDiscover(array( 'classmap' => array( 'CatalogOrder' => "CatalogOrder", 'CatalogOrderItem' => "CatalogOrderItem" ) )); $autodiscover->setComplexTypeStrategy(new Zend_Soap_Wsdl_Strategy_ArrayOfTypeComplex()); $autodiscover->setClass('CatalogOrderWebService'); $autodiscover->handle(); //Return the consume form and process the actions of the consumer } elseif(isset($_GET['consume'])) { // pointing to the current file here $soap = new Zend_Soap_Client("http://".$_SERVER['HTTP_HOST']."/admin/export/WebService.php?wsdl", array( 'classmap' => array( 'CatalogOrder' => "CatalogOrder", 'CatalogOrderItem' => "CatalogOrderItem" ), 'encoding' => 'iso-8859-1' )); include('CatalogOrderWebserviceConsumer.php'); //Process SOAP requests } else { // pointing to the current file here $soap = new Zend_Soap_Server("http://".$_SERVER['HTTP_HOST']."/admin/export/WebService.php?wsdl", array( 'classmap' => array( 'CatalogOrder' => "CatalogOrder", 'CatalogOrderItem' => "CatalogOrderItem" ), 'encoding' => 'iso-8859-1' )); $soap->setClass('CatalogOrderWebService'); $soap->handle(); } в ini_set('soap.wsdl_cache_enabled', 0); set_include_path(dirname(__FILE__).'/../../libraries/:'.get_include_path()); require_once 'Zend/Loader/Autoloader.php'; Zend_Loader_Autoloader::getInstance(); //Include the classes for the webservice include('CatalogOrder.php'); include('CatalogOrderItem.php'); include('CatalogOrderWebservice.php'); //Check the mode if(isset($_GET['wsdl'])) { $autodiscover = new Zend_Soap_AutoDiscover(array( 'classmap' => array( 'CatalogOrder' => "CatalogOrder", 'CatalogOrderItem' => "CatalogOrderItem" ) )); $autodiscover->setComplexTypeStrategy(new Zend_Soap_Wsdl_Strategy_ArrayOfTypeComplex()); $autodiscover->setClass('CatalogOrderWebService'); $autodiscover->handle(); //Return the consume form and process the actions of the consumer } elseif(isset($_GET['consume'])) { // pointing to the current file here $soap = new Zend_Soap_Client("http://".$_SERVER['HTTP_HOST']."/admin/export/WebService.php?wsdl", array( 'classmap' => array( 'CatalogOrder' => "CatalogOrder", 'CatalogOrderItem' => "CatalogOrderItem" ), 'encoding' => 'iso-8859-1' )); include('CatalogOrderWebserviceConsumer.php'); //Process SOAP requests } else { // pointing to the current file here $soap = new Zend_Soap_Server("http://".$_SERVER['HTTP_HOST']."/admin/export/WebService.php?wsdl", array( 'classmap' => array( 'CatalogOrder' => "CatalogOrder", 'CatalogOrderItem' => "CatalogOrderItem" ), 'encoding' => 'iso-8859-1' )); $soap->setClass('CatalogOrderWebService'); $soap->handle(); }