Я был очень занят времени с вэб-кому я должен звонить с PHP , и сегодня я имел дело с заголовков SOAP. По правде говоря, это мир, совсем темно, и я встречался со многими препятствиями. Я вам скажу, где и как я решил, но сначала давайте посмотрим на некоторые теории.
Веб-сервисы стали основной способ обмена информацией между приложениями, независимо от платформ, операционных систем и программирования Языки. SOAP является одним из протоколов, на которых происходит обмен данными и основан на XML, так, чтобы клиент запрашивает сервер с форматом XML, и получает ответ в другой XML. Чтобы понять, что мы имеем в виду давайте посмотрим на структуру запрос SOAP и ответа.
Call (запрос):
- encoding = "UTF-8" ?> <? Xml версия = "1,0" кодировка = "UTF-8"?>
- xmlns:ns1= "com.xplota.ws" > Xmlns: SOAP-ENV = "http://schemas.xmlsoap.org/soap/envelope/" xmlns: ns1 = <SOAP-ENV:Envelope "com.xplota.ws">
- <SOAP-ENV:Header>
- <ns1:entity>
- <code> 1 </> Code
- <Desc> </ Desc>
- </ Ns1:> лица
- <ns1:language>
- <code> 1 </> Code
- <Desc> </ Desc>
- </ Ns1: язык>
- <ns1:userId>
- <code> 1 </> Code
- <Desc> </ Desc>
- </ Ns1:> пользователь
- </ SOAP-ENV: заголовок>
- <SOAP-ENV:Body>
- </ SOAP-ENV: Body>
- </ SOAP-ENV: Envelope>
Ответ (ответ):
- encoding = "utf-8" ?> <? Xml версия = "1,0" кодировка = "UTF-8"?>
- xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd = "http://www.w3.org/2001/XMLSchema" > <Мыло: конверт xmlns: мыло = "http://schemas.xmlsoap.org/soap/envelope/" xmlns: XSI = "http://www.w3.org/2001/XMLSchema-instance" xmlns: XSD = " http://www.w3.org/2001/XMLSchema ">
- <soap:Header>
- > <status Xmlns = "com.xplota.ws">
- <code> 0 </> Code
- <Desc> Ok </ Desc>
- </ Статус>
- </ Мыло: заголовок>
- <soap:Body>
- </ Мыло: Body>
- </ Мыло: Envelope>
Как видно из предыдущих списков, как запрос и ответ состоит из двух узлов XML, заголовка и тела. Обычно используется тела (которую я оставил пустым, потому что мы не заинтересованы в это время), и которые содержат как параметры, которые направляются в WebService в запросе, как вернулся в ответ.
Отправка мыла заголовки
В данном случае следует направлять определенные параметры в заголовке, а брать их из потенциальных кодов ошибок, если бы было. Отгрузки, несмотря на то структуры, а не простой параметр, была простой, можно определить класс с соответствующими параметрами и отправляется напрямую. SOAP двигателя PHP несет ответственность за перевод. Рассмотрим пример.
- / / Определение класса заголовки
- wsHeader класса
- (
- = 0 ; общественного $ Code = 0;
- = ” ; общественного $ Desc = ";
- $code , $desc ) { публичную функцию __construct ($ код $ убыванию) (
- = $code ; Это $ -> Code = $ кода;
- = $desc ; Это $ -> Desc = $ убыванию;
- )
- )
- / / Экземпляр клиента SOAP
- SoapClient ( "http://midominio.com/ws?wsdl" , $par ) ; Клиент $ = новый SoapClient ("http://midominio.com/ws?wsdl", $ номинальной);
- / / Добавить заголовки на запросы
- = new SoapHeader ( "com.xplota.ws" , 'entity' , new wsHeader ( 1 , ” ) ) ; $ Заголовки [] = новый SoapHeader (com.xplota.ws ", 'лицо', новые wsHeader (1"));
- = new SoapHeader ( "com.xplota.ws" , 'language' , new wsHeader ( 1 , ” ) ) ; $ Заголовки [] = новый SoapHeader (com.xplota.ws, "язык", новый wsHeader (1 "));
- = new SoapHeader ( "com.xplota.ws" , 'userId' , new wsHeader ( 1 , ” ) ) ; $ Заголовки [] = новый SoapHeader (com.xplota.ws ',' Идентификатор пользователя, новый wsHeader (1 "));
- $headers ) ; $ Клиент -> __setSoapHeaders ($ заголовки);
- / / Запуск вызова метода было
- -> TuMetodo ( $parametros ) ; Результат $ = $ клиента -> TuMetodo ($ параметрами);
Как вы можете видеть довольно прост для понимания. При добавлении заголовка необходимо указать пространство имен принадлежит двигателя SOAP знает, как обращаться с ней, дается имя и объект, который содержит ее.
При этом мы решили доставки стороне головы и запрос SOAP, как мы указывали в первом XML.
Прием SOAP заголовки
Теперь, когда метод в нашем вебсервис говорит с некоторыми другими заголовки, что мы знаем, как интерпретировать ответ XML в качестве второго списка. Тогда у нас есть очень большая проблема. Существует никакой возможности получить эти заголовки, двигатель SOAP в PHP возвращает только тело, не заголовки.
По PHP ручной метод __soapCall клиента SOAP для определения массива, который вернет эти заголовки, но я был не в состоянии выполнить вызов из WebService метод этот синтаксис в то время как применение их непосредственно на клиента (как документации сказано, что можно сделать) я работал идеально. Таким образом, теория говорит, что первый метод я могу получить заголовки, но я работал, когда я работал вторым, но он возвращает заголовки и нет никакой возможности восстановить их.
После долгой ссоры с SOAP и исследовательские функции, но еще не прибыли на какие-либо выводы, это как если бы это было кому-либо, я не нашел ничего полезного. У меня было только решение, сделать свой класс от SOAP оригинальный ответ на процесс XML вручную, чтобы получить необходимые данные. Сказал и сделал. Пусть решение.
Сначала я создаю свой собственный вид SOAP и я могу проверить, если я могу делать что хочу.
- SoapClient { XSoapClient класс расширяет SoapClient (
- $wsdl , $options ) { публичную функцию __construct ($ WSDL, $ варианты) (
- , $options ) ; родителей:: __construct ($ WSDL, $ опционы);
- )
- $request , $location , $action , $version ) { общественного __doRequest функции ($ просьбе, $ местоположения, $ действий, $ версия) (
- $request , $location , $action , $version ) ; $ Response = родителей:: __doRequest ($ просьбе, $ местоположения, $ действий, $ версии);
- ; вернуть $ реагирования;
- )
- )
- XSoapClient ( "http://midominio.com/ws?wsdl" , $par ) ; Клиент $ = новый XSoapClient (http://midominio.com/ws?wsdl ", $ номинальной);
Думаю, я буду очень повезет, если я попытаюсь это новый клиент SOAP работает прекрасно, но если я могу проверить содержимое переменной $ ответ я вижу, что содержит полный XML WebService ответ. Как вы видите, единственное, что изменения в том, что произошло экземпляр имя нового класса. Хорошее начало, если я буду играть свои карты правильно я могу получить заголовки в методе __doRequest
.
Давайте так как это XML получить то, чего мы хотим. Благодаря функции DOM и XPath в PHP очень прост. Это результат моего клиента восстановления заголовков SOAP:
- SoapClient класса SoapClient распространяется XSoapClient
- (
- $wsdl , $options ) { публичную функцию __construct ($ WSDL, $ варианты) (
- , $options ) ; родителей:: __construct ($ WSDL, $ опционы);
- )
- $request , $location , $action , $version ) { общественного __doRequest функции ($ просьбе, $ местоположения, $ действий, $ версия) (
- $request , $location , $action , $version ) ; $ Response = родителей:: __doRequest ($ просьбе, $ местоположения, $ действий, $ версии);
- DOMDocument; Дом $ = новый DOMDocument;
- ( $response , LIBXML_NOWARNING ) ; $ Dom -> loadXML ($ ответ LIBXML_NOWARNING)
- DOMXPath ( $dom ) ; $ Path = новый DOMXPath ($ дом);
- ( 'soap' , 'http://schemas.xmlsoap.org/soap/envelope/' ) ; $ PATH -> registerNamespace ('мыло', 'http://schemas.xmlsoap.org/soap/envelope/');
- -> query ( '//soap:Header/*' ) ; $ = $ Xml путь -> запрос ('/ / мыло: Header / *');
- = $this -> headers2array ( $xml ) ; Это $ -> = $ responseHeaders этом -> headers2array ($ XML);
- ; вернуть $ реагирования;
- )
- getResponseHeaders государственные функции () (
- -> responseHeaders ; возвращение $ этом -> responseHeaders;
- )
- $response ) { headers2array частные функции ($ ответ) (
- $response as $node ) { Еогеасп ($ ответ как $ узел) (
- $node -> hasChildNodes ( ) ) { если ($ узел -> hasChildNodes ()) (
- $node -> nodeName ] = $this -> headers2array ( $node -> childNodes ) ; Заголовки $ [$ узел -> имя_узла] = $ этом -> headers2array ($ узел -> childNodes);
- { Остальное ()
- $node -> nodeName ] = $node -> nodeValue ; Заголовки $ [$ узел -> имя_узла] = $ узел -> NodeValue;
- )
- )
- ; вернуть $ заголовков;
- )
- )
- = new XSoapClient ( "http://midominio.com/ws?wsdl" , $par ) ; LANG = <pre "php"> $ = новый клиент XSoapClient (http://midominio.com/ws?wsdl ", $ номинальной);
- -> TuMetodo ( $parametros ) ; Результат $ = $ клиента -> TuMetodo ($ параметрами);
- -> getResponseHeaders ( ) ; $ = $ Soapheaders клиента -> getResponseHeaders ();
Проблема решена и весьма элегантно. Если кто-нибудь знает, как получить заголовки без монтажа весь этот бардак, вы скажите мне, пожалуйста.










3 пользователей не прокомментировали "Веб-сервисы: Работа с заголовков SOAP в PHP"
Feed комментариев к данной записи TrackbackВ форме
$ Клиент-> __soapCall (^ с ^ зотеРипсЫоп ", массив ($, $ Ь, $ с), NULL,
SoapHeader новый (), $ output_headers)
должны работать, в противном случае вам будет из-за некоторых особенностей сервиса на стороне сервера.
http://www.php.net/manual/es/soapclient.soapcall.php
Bellzebu Действительно, теория хорошо
[...] Работа с заголовков SOAP в PHP (2) PHP, программирование, техническая После предыдущей статье объяснить, как читать заголовки в ответ SOAP, я обнаружил, как сделать [...]
Написать ответ