PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
ilya73
Отправлено: 01 Августа, 2017 - 17:14:18
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Авг. 2017  


Помог: 0 раз(а)




Пробую создать web-службу.
Программа сервера (server.php)
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. ini_set('soap.wsdl_cache_enabled','Off');
  5.  
  6.  class CallBackService {
  7.  
  8.   function sendResponse($prefix)
  9.    {
  10.     return array("status" => "0");
  11.    }
  12.  }
  13.  
  14. $server = new SoapServer("server.wsdl");
  15. $server->setClass("CallBackService");
  16. $server->handle();
  17. ?>
  18.  

Wsdl-файл (server.wsdl)
CODE (html):
скопировать код в буфер обмена
  1.  
  2. <?xml version='1.0' encoding='UTF-8'?>
  3. <wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  4.                  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  5.                  xmlns:tns="http://emu.callback.mis.service.nr.eu.rt.ru/"
  6.                  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  7.                  xmlns:ns1="http://schemas.xmlsoap.org/soap/http"
  8.                  name="callback" targetNamespace="http://emu.callback.mis.service.nr.eu.rt.ru/">
  9.     <wsdl:types>
  10.         <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://emu.callback.mis.service.nr.eu.rt.ru/"
  11.                   elementFormDefault="unqualified" targetNamespace="http://emu.callback.mis.service.nr.eu.rt.ru/"
  12.                   version="1.0">
  13.             <xs:element name="sendResponse" type="tns:sendResponse"/>
  14.             <xs:element name="sendResponseResponse" type="tns:sendResponseResponse"/>
  15.             <xs:complexType name="sendResponse">
  16.                 <xs:sequence>
  17.                     <xs:element name="id" type="xs:string"/>
  18.                     <xs:element name="oid" type="xs:string"/>
  19.                     <xs:element name="response" type="xs:string"/>
  20.                 </xs:sequence>
  21.             </xs:complexType>
  22.             <xs:complexType name="sendResponseResponse">
  23.                 <xs:sequence>
  24.                     <xs:element name="status" type="xs:int"/>
  25.                 </xs:sequence>
  26.             </xs:complexType>
  27.         </xs:schema>
  28.     </wsdl:types>
  29.     <wsdl:message name="sendResponse">
  30.         <wsdl:part element="tns:sendResponse" name="parameters">
  31.         </wsdl:part>
  32.     </wsdl:message>
  33.     <wsdl:message name="sendResponseResponse">
  34.         <wsdl:part element="tns:sendResponseResponse" name="parameters">
  35.         </wsdl:part>
  36.     </wsdl:message>
  37.     <wsdl:portType name="Callback">
  38.         <wsdl:operation name="sendResponse">
  39.             <wsdl:input message="tns:sendResponse" name="sendResponse">
  40.             </wsdl:input>
  41.             <wsdl:output message="tns:sendResponseResponse" name="sendResponseResponse">
  42.             </wsdl:output>
  43.         </wsdl:operation>
  44.     </wsdl:portType>
  45.     <wsdl:binding name="callbackSoapBinding" type="tns:Callback">
  46.         <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
  47.         <wsdl:operation name="sendResponse">
  48.             <soap:operation soapAction="sendResponse" style="document"/>
  49.             <wsdl:input name="sendResponse">
  50.                 <soap:body use="literal"/>
  51.             </wsdl:input>
  52.             <wsdl:output name="sendResponseResponse">
  53.                 <soap:body use="literal"/>
  54.             </wsdl:output>
  55.         </wsdl:operation>
  56.     </wsdl:binding>
  57.     <wsdl:service name="callback">
  58.         <wsdl:port binding="tns:callbackSoapBinding" name="CallbackPort">
  59.             <soap:address location="http://127.0.0.1/server.php"/>
  60.         </wsdl:port>
  61.     </wsdl:service>
  62. </wsdl:definitions>
  63.  
  64.  

На запросы сервер выдает следующий ответ:
CODE (html):
скопировать код в буфер обмена
  1.  
  2. <SOAP-ENV:Envelope xmlns:ns1="http://emu.callback.mis.service.nr.eu.rt.ru/"
  3. xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  4.  <SOAP-ENV:Body>
  5.   <ns1:sendResponseResponse>
  6.    <status>0</status>
  7.   </ns1:sendResponseResponse>
  8.  </SOAP-ENV:Body>
  9. </SOAP-ENV:Envelope>
  10.  

Но такой ответ не нужен. Надо выдавать другой ответ. Причем готовый ответ уже есть в виде xml-файла. Как это сделать?
 
 Top
Vladimir Kheifets
Отправлено: 01 Августа, 2017 - 20:24:09
Post Id



Частый гость


Покинул форум
Сообщений всего: 141
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 3 раз(а)




Добрый вечер!
Из того, что Вы показали виден только один метод sendResponse($prefix),
который всгда возвращает array("status" => "0")
Клиент выглядет примерно так?

PHP:
скопировать код в буфер обмена
  1. $api = new SoapClient(......);
  2. try
  3. {      
  4.     $response=$api->sendResponse($request);
  5.     var_dump($response);  
  6. }
  7. catch(SoapFault $fault)
  8. {
  9.      print "SOAP-Fehler: (Fehlernummer: {$fault->faultcode}, Fehlermeldung: {$fault->faultstring})";
  10. }

(Отредактировано автором: 02 Августа, 2017 - 07:17:19)

 
 Top
ilya73
Отправлено: 02 Августа, 2017 - 09:50:42
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Авг. 2017  


Помог: 0 раз(а)




Какой клиент я не знаю, так как к серверу будет подключаться, в принципе, неизвестно кто. Пусть будет такой клиент, какой Вы предложили. Требуется, чтобы сервер выдал ответ с тегом header, который очень сложен чтобы формировать его программно на php. Есть готовый ответ (образец в виде xml-файла), в нем средствами php можно подправить несколько тегов. Но как отправить этот отредактированный образец вместо ответа сервера, приведенного в начале темы я не знаю. Есть ли такая возможность?

(Отредактировано автором: 02 Августа, 2017 - 09:51:49)

 
 Top
Vladimir Kheifets
Отправлено: 02 Августа, 2017 - 11:08:07
Post Id



Частый гость


Покинул форум
Сообщений всего: 141
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 3 раз(а)




ilya73 пишет:
Какой клиент я не знаю, так как к серверу будет подключаться, в принципе, неизвестно кто. Пусть будет такой клиент, какой Вы предложили. Требуется, чтобы сервер выдал ответ с тегом header, который очень сложен чтобы формировать его программно на php. Есть готовый ответ (образец в виде xml-файла), в нем средствами php можно подправить несколько тегов. Но как отправить этот отредактированный образец вместо ответа сервера, приведенного в начале темы я не знаю. Есть ли такая возможность?

Обычно все Веб-сервисы дают клиентам документацию, в которой можно найти описание
requests-response, схемы и описание методов.
Сервис должны обслуживать запросы и для каждого типа запросов должен быть разработан соответствующий метод, который, например, что-то выбирает из БД, обрабатывает данные и возвращает responsе.
В Вашем случае должен быть метод, который должен что-то сделать с шаблоном.
Чтобы было понятнее, Вы можете посмотреть, демо-версию SOAP Веб-сервиса
демо:
https://www[dot]alto-booking[dot]com/dem[dot][dot][dot]/SOAP/client.php
описание методов:
https://www[dot]alto-booking[dot]com/dem[dot][dot][dot]_AltoBooking[dot]pdf
исходный код клиента:
https://www.alto-booking.com/demo/SOAP/DemoClient.zip

(Отредактировано автором: 02 Августа, 2017 - 11:08:37)

 
 Top
ilya73
Отправлено: 02 Августа, 2017 - 16:05:49
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Авг. 2017  


Помог: 0 раз(а)




Абсолютно с Вами согласен. Обычно так и построены web-сервисы.
Но web-сервис, которым я занимаюсь, может отвечать однозначно на все запросы с параметром status=0, только в ответе нужно заменить содержимое тега <a:RelatesTo> и тега <a:MessageID>. С этим я справлюсь. Все остальное остается неизменным.
Но как «загнать» в ответ следующий текст?
CODE (html):
скопировать код в буфер обмена
  1.  
  2. <?xml version="1.0"?>
  3. <s:Envelope xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
  4. xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  5. <s:Header>
  6. <a:Action s:mustUnderstand="1">http://emu.callback.mis.service.nr.eu.rt.ru/Callback/sendResponseResponse</a:Action>
  7. <a:RelatesTo>CL-7bb65177-07aea0bf-b5ddb51c-4c2035ed-c22f16ba</a:RelatesTo>
  8. <transportHeader xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://egisz.rosminzdrav.ru">
  9. <authInfo>
  10. <clientEntityId>v7kdcg6i-vqqw-bqru-ohn9-izfr0fzq5ehc0cssi5i6ttoj13jtt9</clientEntityId>
  11. </authInfo>
  12. </transportHeader>
  13. <a:MessageID>84604636-0c46-47f4-97f7-25606b41cddc</a:MessageID>
  14. <wsse:Security s:actor="http://smev.gosuslugi.ru/actors/smev">
  15. <wsse:BinarySecurityToken xmlns:p7="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" p7:Id="CertId" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">MIIDljCCA0WgAwIBAgITEgAaFswM0KDRj9C30LDQvdGMMRswGQYDVQQIDBLQoNGP0LfQsNC90YHQutCw0Y8xCzAJBgNVBAYTAlJVMGMwHAYGKoUDAgITMBIGByqFAwICJAAGByqFAwICHgEDQwAEQOJHs3NtNGsbbuBNpvJSg3RxZRf35G4rkUoA2x4cWYlFVQ==</wsse:BinarySecurityToken>
  16. <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
  17. <SignedInfo>
  18. <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
  19. <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"/>
  20. <Reference URI="#body">
  21. <Transforms>
  22. <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
  23. </Transforms>
  24. <DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/>
  25. <DigestValue>kdn7xNHNOuSOm//ikNEQMWLHhQcf6GknFriyOYDWjsI=</DigestValue>
  26. </Reference>
  27. </SignedInfo>
  28. <SignatureValue>H4qatrJ8BUDkjsRbF2i3T2Mj8ENzy5LuH4Jupib9k5Qb7YGZUlx8fu/3ycNgFCnimzsV0+d7OfWONARsSsd7xQ==</SignatureValue>
  29. <KeyInfo>
  30. <wsse:SecurityTokenReference>
  31. <wsse:Reference URI="#CertId"/>
  32. </wsse:SecurityTokenReference>
  33. </KeyInfo>
  34. </Signature>
  35. </wsse:Security>
  36. </s:Header>
  37. <s:Body d2p1:Id="body" xmlns:d2p1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
  38. <sendResponseResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://emu.callback.mis.service.nr.eu.rt.ru/">
  39. <status xmlns="">0</status>
  40. </sendResponseResponse>
  41. </s:Body>
  42. </s:Envelope>
  43.  
 
 Top
Vladimir Kheifets
Отправлено: 03 Августа, 2017 - 08:48:47
Post Id



Частый гость


Покинул форум
Сообщений всего: 141
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 3 раз(а)




ilya73 пишет:
Абсолютно с Вами согласен. Обычно так и построены web-сервисы.
Но web-сервис, которым я занимаюсь, может отвечать однозначно на все запросы с параметром status=0, только в ответе нужно заменить содержимое тега <a:RelatesTo> и тега <a:MessageID>. С этим я справлюсь. Все остальное остается неизменным.
Но как «загнать» в ответ следующий текст?
Спойлер (Отобразить)

Доброе утро!
Вы разрабатываете SOAP Web-сервис. Верно?
https://habrahabr[dot]ru/post/187390/
Вы написали:
“Какой клиент я не знаю, так как к серверу будет подключаться, в принципе, неизвестно кто.”
Кто не известно, но известно как, - по протоколу SOAP, поддерживающему удалённый вызов процедур с сервера на стороне клиента.
В Вашем случае, это процедура sendResponse, которая должна возвращать, например, массив с элементами status, RelatesTo, MessageID ....
Честно говоря, не понятно, зачем "отвечать однозначно на все запросы с параметром status=0".

(Отредактировано автором: 03 Августа, 2017 - 08:49:28)

 
 Top
ilya73
Отправлено: 03 Августа, 2017 - 10:21:13
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Авг. 2017  


Помог: 0 раз(а)




Возможно я не совсем корректно выразился:
ilya73 пишет:
Какой клиент я не знаю, так как к серверу будет подключаться, в принципе, неизвестно кто.

Да, клиент будет такой:
Vladimir Kheifets пишет:
по протоколу SOAP, поддерживающему удалённый вызов процедур с сервера на стороне клиента.

Но какая именно реализация этого клиента я не знаю.
Мой SOAP web-сервис на запрос клиента должен ответить именно так, как написано в образце.
Status=0 в случае успеха, в ином случае ответ будет другим, но на данном этапе это не важно.
Важно то, как "загнать" все это нагромождение xml-кода в ответ сервера. Ведь там нужно вычислить хэш, каноникализировать текст, создать ЭЦП на основе сертификата. Делать это на основе php нереально. Да и зачем, если это статичный текст, он меняться не будет.
А вот как отправить этот текст клиенту, к сожалению, пока ответа нет.
 
 Top
Vladimir Kheifets
Отправлено: 03 Августа, 2017 - 12:14:47
Post Id



Частый гость


Покинул форум
Сообщений всего: 141
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 3 раз(а)




ilya73 пишет:
Мой SOAP web-сервис на запрос клиента должен ответить именно так, как написано в образце.
Status=0 в случае успеха, в ином случае ответ будет другим, но на данном этапе это не важно.
Важно то, как "загнать" все это нагромождение xml-кода в ответ сервера. Ведь там нужно вычислить хэш, каноникализировать текст, создать ЭЦП на основе сертификата. Делать это на основе php нереально. Да и зачем, если это статичный текст, он меняться не будет.
А вот как отправить этот текст клиенту, к сожалению, пока ответа нет.


1. Делать это на основе php нереально....
я полагал, что речь идёт о реализации протокола SOAP на PHP.
http://php.net/manual/ru/class.soapserver.php
http://php.net/manual/ru/class.soapclient.php

2. как "загнать" все это нагромождение xml-кода в ответ сервера...
Это ответ на Ваш вопрос:
"SOAP – протокол используемый для реализации удаленного вызова процедур и в качестве транспорта он использует XML!".
источник https://habrahabr[dot]ru/post/187390/
 
 Top
ilya73
Отправлено: 03 Августа, 2017 - 13:27:51
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Авг. 2017  


Помог: 0 раз(а)




Vladimir Kheifets пишет:
я полагал, что речь идёт о реализации протокола SOAP на PHP.

Именно так. Нужна реализация web-сервиса на основе SOAP.
Vladimir Kheifets пишет:
"SOAP – протокол используемый для реализации удаленного вызова процедур и в качестве транспорта он использует XML!".

Не понял. Возможно или нет?
 
 Top
ilya73
Отправлено: 07 Августа, 2017 - 10:43:59
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Авг. 2017  


Помог: 0 раз(а)




Если возможно, то как это реализовать?
 
 Top
Vladimir Kheifets
Отправлено: 07 Августа, 2017 - 15:59:43
Post Id



Частый гость


Покинул форум
Сообщений всего: 141
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 3 раз(а)




ilya73 пишет:
Если возможно, то как это реализовать?


Добрый день! Такой "необычный" SOAP Веб-Сервис я не разрабатывал и у меня нет возможности экспериментировать с Вашей задачей. Свою реализацию с исходными кодами я Вам показал.
Необычное в Вашем SOAP Веб-Сервисе то, что необходимо отправлять клиенту конкретный XML-Respose.
Причём, как Вы пишете, необходимо модифицировать в Header содержимое тега <a:RelatesTo> и тега <a:MessageID>

Теперь про то возможно ли и как:

Здесь пишут, что возможно https://stackoverflow[dot]com/questi[dot][dot][dot]e-with-phps-soap
Дают пример:
Спойлер (Отобразить)

и показывают XML:
Спойлер (Отобразить)

(Отредактировано автором: 09 Августа, 2017 - 14:54:08)

 
 Top
ilya73
Отправлено: 09 Августа, 2017 - 09:35:59
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Авг. 2017  


Помог: 0 раз(а)




Большое спасибо.
 
 Top
ilya73
Отправлено: 09 Августа, 2017 - 11:38:46
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Авг. 2017  


Помог: 0 раз(а)




Подскажите пожалуйста, как сделать следующее:
CODE (html):
скопировать код в буфер обмена
  1. <?xml version="1.0" encoding="WINDOWS-1251"?>
  2. <SOAP-ENV:Envelope
  3. xmlns:ns1="http://emu.callback.mis.service.nr.eu.rt.ru/"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  6. <SOAP-ENV:Header></SOAP-ENV:Header>
  7. <SOAP-ENV:Body id="body1">
  8. <ns1:sendResponseResponse>
  9. <status>0</status>
  10. </ns1:sendResponseResponse>
  11. </SOAP-ENV:Body>
  12. </SOAP-ENV:Envelope>


То есть, в узел "Body" вставить id="body1".
 
 Top
Vladimir Kheifets
Отправлено: 09 Августа, 2017 - 14:52:02
Post Id



Частый гость


Покинул форум
Сообщений всего: 141
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 3 раз(а)




ilya73 пишет:
Подскажите пожалуйста, как сделать следующее:
в узел "Body" вставить id="body1".

Добрый день!
Я не пробовал, но предполагаю, что не получится.
В спецификации SOAP 1.2 для элемента body доускаются только следущие не обязательные атрибуты parts, use, encodingStyle, namespace.
https://docs[dot]oracle[dot]com/cd/E1918[dot][dot][dot]geif2/index[dot]html
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB