Я был очень занят времени с вэб-кому я должен звонить с PHP , и сегодня я имел дело с заголовков SOAP. По правде говоря, это мир, совсем темно, и я встречался со многими препятствиями. Я вам скажу, где и как я решил, но сначала давайте посмотрим на некоторые теории.

Веб-сервисы стали основной способ обмена информацией между приложениями, независимо от платформ, операционных систем и программирования Языки. SOAP является одним из протоколов, на которых происходит обмен данными и основан на XML, так, чтобы клиент запрашивает сервер с форматом XML, и получает ответ в другой XML. Чтобы понять, что мы имеем в виду давайте посмотрим на структуру запрос SOAP и ответа.

Call (запрос):

  1. encoding = "UTF-8" ?> <? Xml версия = "1,0" кодировка = "UTF-8"?>
  2. xmlns:ns1= "com.xplota.ws" > Xmlns: SOAP-ENV = "http://schemas.xmlsoap.org/soap/envelope/" xmlns: ns1 = <SOAP-ENV:Envelope "com.xplota.ws">
  3. <SOAP-ENV:Header>
  4. <ns1:entity>
  5. <code> 1 </> Code
  6. <Desc> </ Desc>
  7. </ Ns1:> лица
  8. <ns1:language>
  9. <code> 1 </> Code
  10. <Desc> </ Desc>
  11. </ Ns1: язык>
  12. <ns1:userId>
  13. <code> 1 </> Code
  14. <Desc> </ Desc>
  15. </ Ns1:> пользователь
  16. </ SOAP-ENV: заголовок>
  17. <SOAP-ENV:Body>
  18. </ SOAP-ENV: Body>
  19. </ SOAP-ENV: Envelope>

Ответ (ответ):

  1. encoding = "utf-8" ?> <? Xml версия = "1,0" кодировка = "UTF-8"?>
  2. 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 ">
  3. <soap:Header>
  4. > <status Xmlns = "com.xplota.ws">
  5. <code> 0 </> Code
  6. <Desc> Ok </ Desc>
  7. </ Статус>
  8. </ Мыло: заголовок>
  9. <soap:Body>
  10. </ Мыло: Body>
  11. </ Мыло: Envelope>

Как видно из предыдущих списков, как запрос и ответ состоит из двух узлов XML, заголовка и тела. Обычно используется тела (которую я оставил пустым, потому что мы не заинтересованы в это время), и которые содержат как параметры, которые направляются в WebService в запросе, как вернулся в ответ.

Отправка мыла заголовки

В данном случае следует направлять определенные параметры в заголовке, а брать их из потенциальных кодов ошибок, если бы было. Отгрузки, несмотря на то структуры, а не простой параметр, была простой, можно определить класс с соответствующими параметрами и отправляется напрямую. SOAP двигателя PHP несет ответственность за перевод. Рассмотрим пример.

  1. / / Определение класса заголовки
  2. wsHeader класса
  3. (
  4. = 0 ; общественного $ Code = 0;
  5. = ; общественного $ Desc = ";
  6. $code , $desc ) { публичную функцию __construct ($ код $ убыванию) (
  7. = $code ; Это $ -> Code = $ кода;
  8. = $desc ; Это $ -> Desc = $ убыванию;
  9. )
  10. )
  11. / / Экземпляр клиента SOAP
  12. ( ) ; Пар $ = массив ();
  13. SoapClient ( "http://midominio.com/ws?wsdl" , $par ) ; Клиент $ = новый SoapClient ("http://midominio.com/ws?wsdl", $ номинальной);
  14. / / Добавить заголовки на запросы
  15. ( ) ; Заголовки $ = массив ();
  16. = new SoapHeader ( "com.xplota.ws" , 'entity' , new wsHeader ( 1 , ) ) ; $ Заголовки [] = новый SoapHeader (com.xplota.ws ", 'лицо', новые wsHeader (1"));
  17. = new SoapHeader ( "com.xplota.ws" , 'language' , new wsHeader ( 1 , ) ) ; $ Заголовки [] = новый SoapHeader (com.xplota.ws, "язык", новый wsHeader (1 "));
  18. = new SoapHeader ( "com.xplota.ws" , 'userId' , new wsHeader ( 1 , ) ) ; $ Заголовки [] = новый SoapHeader (com.xplota.ws ',' Идентификатор пользователя, новый wsHeader (1 "));
  19. $headers ) ; $ Клиент -> __setSoapHeaders ($ заголовки);
  20. / / Запуск вызова метода было
  21. -> TuMetodo ( $parametros ) ; Результат $ = $ клиента -> TuMetodo ($ параметрами);

Как вы можете видеть довольно прост для понимания. При добавлении заголовка необходимо указать пространство имен принадлежит двигателя SOAP знает, как обращаться с ней, дается имя и объект, который содержит ее.

При этом мы решили доставки стороне головы и запрос SOAP, как мы указывали в первом XML.

Прием SOAP заголовки

Теперь, когда метод в нашем вебсервис говорит с некоторыми другими заголовки, что мы знаем, как интерпретировать ответ XML в качестве второго списка. Тогда у нас есть очень большая проблема. Существует никакой возможности получить эти заголовки, двигатель SOAP в PHP возвращает только тело, не заголовки.

По PHP ручной метод __soapCall клиента SOAP для определения массива, который вернет эти заголовки, но я был не в состоянии выполнить вызов из WebService метод этот синтаксис в то время как применение их непосредственно на клиента (как документации сказано, что можно сделать) я работал идеально. Таким образом, теория говорит, что первый метод я могу получить заголовки, но я работал, когда я работал вторым, но он возвращает заголовки и нет никакой возможности восстановить их.

После долгой ссоры с SOAP и исследовательские функции, но еще не прибыли на какие-либо выводы, это как если бы это было кому-либо, я не нашел ничего полезного. У меня было только решение, сделать свой класс от SOAP оригинальный ответ на процесс XML вручную, чтобы получить необходимые данные. Сказал и сделал. Пусть решение.

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

  1. SoapClient { XSoapClient класс расширяет SoapClient (
  2. $wsdl , $options ) { публичную функцию __construct ($ WSDL, $ варианты) (
  3. , $options ) ; родителей:: __construct ($ WSDL, $ опционы);
  4. )
  5. $request , $location , $action , $version ) { общественного __doRequest функции ($ просьбе, $ местоположения, $ действий, $ версия) (
  6. $request , $location , $action , $version ) ; $ Response = родителей:: __doRequest ($ просьбе, $ местоположения, $ действий, $ версии);
  7. ; вернуть $ реагирования;
  8. )
  9. )
  10. XSoapClient ( "http://midominio.com/ws?wsdl" , $par ) ; Клиент $ = новый XSoapClient (http://midominio.com/ws?wsdl ", $ номинальной);

Думаю, я буду очень повезет, если я попытаюсь это новый клиент SOAP работает прекрасно, но если я могу проверить содержимое переменной $ ответ я вижу, что содержит полный XML WebService ответ. Как вы видите, единственное, что изменения в том, что произошло экземпляр имя нового класса. Хорошее начало, если я буду играть свои карты правильно я могу получить заголовки в методе __doRequest :) .

Давайте так как это XML получить то, чего мы хотим. Благодаря функции DOM и XPath в PHP очень прост. Это результат моего клиента восстановления заголовков SOAP:

  1. SoapClient класса SoapClient распространяется XSoapClient
  2. (
  3. = array ( ) ; частных $ responseHeaders = массив ();
  4. $wsdl , $options ) { публичную функцию __construct ($ WSDL, $ варианты) (
  5. , $options ) ; родителей:: __construct ($ WSDL, $ опционы);
  6. )
  7. $request , $location , $action , $version ) { общественного __doRequest функции ($ просьбе, $ местоположения, $ действий, $ версия) (
  8. $request , $location , $action , $version ) ; $ Response = родителей:: __doRequest ($ просьбе, $ местоположения, $ действий, $ версии);
  9. DOMDocument; Дом $ = новый DOMDocument;
  10. ( $response , LIBXML_NOWARNING ) ; $ Dom -> loadXML ($ ответ LIBXML_NOWARNING)
  11. DOMXPath ( $dom ) ; $ Path = новый DOMXPath ($ дом);
  12. ( 'soap' , 'http://schemas.xmlsoap.org/soap/envelope/' ) ; $ PATH -> registerNamespace ('мыло', 'http://schemas.xmlsoap.org/soap/envelope/');
  13. -> query ( '//soap:Header/*' ) ; $ = $ Xml путь -> запрос ('/ / мыло: Header / *');
  14. = $this -> headers2array ( $xml ) ; Это $ -> = $ responseHeaders этом -> headers2array ($ XML);
  15. ; вернуть $ реагирования;
  16. )
  17. getResponseHeaders государственные функции () (
  18. -> responseHeaders ; возвращение $ этом -> responseHeaders;
  19. )
  20. $response ) { headers2array частные функции ($ ответ) (
  21. ( ) ; Заголовки $ = массив ();
  22. $response as $node ) { Еогеасп ($ ответ как $ узел) (
  23. $node -> hasChildNodes ( ) ) { если ($ узел -> hasChildNodes ()) (
  24. $node -> nodeName ] = $this -> headers2array ( $node -> childNodes ) ; Заголовки $ [$ узел -> имя_узла] = $ этом -> headers2array ($ узел -> childNodes);
  25. { Остальное ()
  26. $node -> nodeName ] = $node -> nodeValue ; Заголовки $ [$ узел -> имя_узла] = $ узел -> NodeValue;
  27. )
  28. )
  29. ; вернуть $ заголовков;
  30. )
  31. )
  32. = new XSoapClient ( "http://midominio.com/ws?wsdl" , $par ) ; LANG = <pre "php"> $ = новый клиент XSoapClient (http://midominio.com/ws?wsdl ", $ номинальной);
  33. -> TuMetodo ( $parametros ) ; Результат $ = $ клиента -> TuMetodo ($ параметрами);
  34. -> getResponseHeaders ( ) ; $ = $ Soapheaders клиента -> getResponseHeaders ();

Проблема решена и весьма элегантно. Если кто-нибудь знает, как получить заголовки без монтажа весь этот бардак, вы скажите мне, пожалуйста.

Если вы оказались полезными эту статью ... Разделять!