Россия, Омск |
Улучшение работы приложения фирмы ITSO Electronics с помощью Web-сервисов
3.5.3 Сгенерированный документ WSDL
Приведенная ниже URL-команда Lotus Domino возвращает документ WSDL для Web-сервиса в ответ на HTTP GET, используя суффикс ?WSDL:
http://servername/databasename.nsf/webservicename?WSDL (http://названиесервера/названиебазыданных.nsf/названиеWeb-сервиса?WSDL)
Например, в нашем сценарии была использована следующая команда:
http://domino7appdev.cam.itso.ibm.com/itso/webservices.nsf/ProductInfo?WSDL
В примере 3.2 показан полученный в результате WSDL-документ.
Для более подробного описания документа WSDL см. "Улучшение работы приложения фирмы ITSO Electronics с помощью Web-сервисов" , "Документ WSDL".
<?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns: apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="urn:DefaultNamespace" xmlns:intf="urn:DefaultNamespace" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http:// schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www. w3.org/2001/XMLSchema" targetNamespace="urn:DefaultNamespace"> <wsdl:message name="GETPRODUCTNAMERequest"> <wsdl:part name="PRODUCTNUMBER" type="xsd:string"/> </wsdl:message> <wsdl:message name="GETPRODUCTNAMEResponse"> <wsdl:part name="GETPRODUCTNAMEReturn" type="xsd:string"/> </wsdl:message> <wsdl:portType name="ProductInfo"> <wsdl:operation name="GETPRODUCTNAME" parameterOrder="PRODUCTNUMBER"> <wsdl:input message="impl:GETPRODUCTNAMERequest" name="GETPRODUCTNAMERequest"/> <wsdl:output message="impl:GETPRODUCTNAMEResponse" name="GETPRODUCTNAMEResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="DominoSoapBinding" type="impl:ProductInfo"> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="GETPRODUCTNAME"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="GETPRODUCTNAMERequest"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/> </wsdl:input> <wsdl:output name="GETPRODUCTNAMEResponse"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="ProductInfoService"> <wsdl:port binding="impl:DominoSoapBinding" name="Domino"> <wsdlsoap:address location="http://domino7appdev.cam.itso.ibm.com:80/itso/webservices.nsf/ ProductInfo?OpenWebService"/> </wsdl:port> </wsdl:service> </wsdl:definitions>Пример 3.2. Код, полученный от сервера при обращении к Web-сервису с суффиксом ?WSDL
Полученный в результате генерации с суффиксом ?WSDL код сложен, однако это не важно, так как документы WSDL считываются компьютерами, а не пользователями. Например, Lotus Domino Designer может импортировать документ WSDL и создавать каркасный класс в LotusScript или Java. Обсуждением данной темы мы занимались в "Улучшение работы приложения фирмы ITSO Electronics с помощью Web-сервисов" , "Импортированный WSDL".
3.5.4 Тестирование простого Web-сервиса
Существует множество приложений, которые позволяют тестировать и использовать Web-сервисы. Для достижения целей, поставленных в этой книге, мы будем использовать IBM Rational Application Developer. Чтобы начать тестирование Web-сервисов, используя Rational Application Developer, выполните приведенную ниже последовательность действий.
- Запустите Rational Application Developer.
- Выберите Run => Launch the Web Services Explorer (Выполнить Запустить обозреватель Web-сервисов).
- Щелкните по иконке WSDL page (вторая справа, находится в верхней правой части основного окна).
- Затем перейдите к панели Navigator (Навигатор) и выберите WSDL Main, как показано на рис. 3.6.
- Перейдите к панели Open WSDL, после чего определите WSDL URL. В нашем приложении ITSO Electronics мы использовали следующий URL:
http://domino7appdev.cam.itso.ibm.com/itso/webservices.nsf/ProductInfo?wsdl
- Щелкните по кнопке Go (Перейти), после чего откроется панель WSDL Binding Details (Детали привязки WSDL), которая представлена на рис. 3.7.
- В панели WSDL Binding Details показаны операции, производимые для элемента SOAP. Выберите операцию, указанную в панели, чтобы записать ее параметры и задействовать ее или же определить большее количество конечных точек. В этом сценарии (сценарии компании ITSO Electronics) выберите операцию GETPRODUCTNAME (Получить название продукта), после чего появится панель Invoke a WSDL Operation (Задействовать операцию WSDL), как показано на рис. 3.8.
- Введем значение PRODUCTNUMBER и щелкнем по кнопке Go. Результат появился в панели Status (Статус). В нашем сценарии в качестве PRODUCTNUMBER (номера продукта) мы ввели значение 45000 и получили результирующую строчку Redbook Basic (см. рис. 3.9).
- Чтобы увидеть, что на самом деле происходит "за кулисами", щелкните по кнопке Source (Источник), находящейся на панели Status. В примере 3.3 приведен код, отправленный на сервер Lotus Domino в контексте запроса SOAP. Код, которым сервер Lotus Domino ответил отправлением контекста ответа SOAP на этот запрос, представлен в примере 3.4, после чего этот код был представлен в панели Status, как и видно из
рис.
3.10.
<?xml version="1.0" encoding="UTF-8" ?> - <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <SOAP-ENV:Body> - <ns0:GETPRODUCTNAME xmlns:ns0="urn:DefaultNamespace" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <PRODUCTNUMBER xsi:type="xsd:string">45000</PRODUCTNUMBER> </ns0:GETPRODUCTNAME> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Пример 3.3. Контекст запроса SOAPsoapenv:Envelope xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <soapenv:Body> - <ns1:GETPRODUCTNAMEResponse xmlns:ns1="urn:DefaultNamespace" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <GETPRODUCTNAMEReturn xsi:type="xsd:string">Redbook Basic</GETPRODUCTNAMEReturn> </ns1:GETPRODUCTNAMEResponse> </soapenv:Body> </soapenv:Envelope>
Пример 3.4. Контекст ответа SOAP, отправленный обратно с сервера - Наконец, чтобы увидеть разницу в формате XML, вернитесь в Lotus Domino Designer и измените формат сообщения SOAP на Wrapped в окне свойств Advanced, как показано на
рис.
3.11. Снова задействуйте Web-сервис GETPRODUCTNAME из Rational Application Developer. Результат будет таким же, как в примерах 3.5 и 3.6.
<?xml version="1.0" encoding="UTF-8" ?> - <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="urn:DefaultNamespace" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <SOAP-ENV:Body> - <q0:GETPRODUCTNAME> <PRODUCTNUMBER>45000</PRODUCTNUMBER> </q0:GETPRODUCTNAME> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Пример 3.5. Контекст запроса SOAP, в котором использован формат сообщения SOAP Wrapped- <soapenv:Envelope xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <soapenv:Body> - <ns1:GETPRODUCTNAMEResponse xmlns:ns1="urn:DefaultNamespace"> <GETPRODUCTNAMEReturn>Redbook Basic</GETPRODUCTNAMEReturn> </ns1:GETPRODUCTNAMEResponse> </soapenv:Body> </soapenv:Envelope>
Пример 3.6. Контекст ответа SOAP, в котором использован формат сообщения SOAP Wrapped