Россия, Омск |
Улучшение работы приложения фирмы ITSO Electronics с помощью Web-сервисов
3.12 Использование Web-сервисов с помощью LS2J
В этом разделе мы расскажем о следующем:
- как использовать Web-сервис с помощью LotusScript;
- как с помощью LS2J обращаться к коду Java из агента LotusScript;
- как работать с исключениями или ошибками, возвращаемыми назад от Web-сервисов;
- об аутентификации и Web-сервисах.
3.12.1 Несколько слов о LS2J
LS2J представляет собой интерфейс, позволяющий переводить данные из типов данных Java в типы данных LotusScript и позволяет LotusScript выполнять методы объектов Java. Благодаря LS2J LotusScript получает способность создавать объекты Java так, будто они были родными для среды LotusScript.
В этом сценарии мы добавили агент LotusScript к базе данных WS Consumer. Агент использует код Java из библиотеки скриптов, для того чтобы использовать Web-сервис.
Web-сервис, который мы используем, способен выполнять одно из двух действий:
- возвращать имя текущего пользователя;
- возвращать объект WS_FAULT, для того чтобы проиллюстрировать, как Web-сервисы способны отправлять коды ошибок обратно к клиенту.
3.12.2 Создание Web-сервиса
Перечисленные ниже этапы показывают, как создать Web-сервис с помощью LS2J. В этом разделе описывается создание Web-сервиса, а в последующих речь пойдет о создании библиотеки скриптов Java и о том, как она используется в нашем агенте LotusScript через LS2J. Выполните приведенную ниже последовательность действий.
- Откройте базу данных Web Services в Domino Designer.
- Щелкните по кнопке New Web Service.
- Убедитесь, что установлен язык кода LotusScript.
- Перейдите к разделу Declarations и перепечатайте код, представленный в примере 3.15.
Dim session As NotesSession Class UserInfo Function getUserName ( Fault1 As WS_FAULT) Set session = New NotesSession Dim doc As NotesDocument Set doc = session.DocumentContext If Cint(Rnd() * 10) > 5 Then getUserName = doc.remote_user(0) Else Call Fault1.setFault(True) ' необходимо для ошибочной активации Call Fault1.setFaultString("SUCCESS, We send a FAULT on purpose") End If End Function End Class
Пример 3.15. Код LS2J Web Service - Откройте окно свойств Web-сервиса и в поле Name и PortType введите UserInfo, как показано на рис. 3.19.
- Сохраните и закройте Web-сервис.
3.12.3 Создание библиотеки скриптов, необходимой для использования Web-сервиса с помощью Java
Теперь нам необходимо создать библиотеку скриптов, содержащую класс Java, который будет использовать Web-сервис и сделает его доступным нашему агенту LotusScript через LS2J. Для того чтобы настроить класс Java, необходимо выполнить следующую последовательность действий:
- Откройте базу данных WS Consumer в Domino Designer.
- В навигационной панели выберите Shared Code (Общий код) и щелкните по кнопке New Java Library (Новая библиотека Java).
- В открывшемся окне щелкните по кнопке Edit Project и выберите файл Apache soap.jar (см. рис. 3.20). Если у вас отсутствует файл Apache soap.jar, необходимо вернуться к "Улучшение работы приложения фирмы ITSO Electronics с помощью Web-сервисов" , "Использование Web-сервисов с помощью Java" для получения дополнительной информации о том, как загрузить Apache SOAP.
- Сохраните библиотеку скриптов под именем ConsumeWSLibrary.
- Замените код для библиотеки по умолчанию кодом, приведенным в примере 3.16.
URL url = new URL("http://domino7appdev.cam.itso.ibm.com/itso/ webservices.nsf/ProductService?WSDL"); String soapAction ="http://domino7appdev.cam.itso.ibm.com/itso/ webservices.nsf/ProductService?WSDL";
import java.io.*; import java.util.*; import java.net.*; import org.w3c.dom.*; import org.apache.soap.util.xml.*; import org.apache.soap.*; import org.apache.soap.encoding.*; import org.apache.soap.encoding.soapenc.*; import org.apache.soap.rpc.*; import org.apache.soap.transport.http.SOAPHTTPConnection; public class WSConsumer { public String getValue(String userName, String password) { try { URL url = new URL("http://domino7appdev.cam.itso.ibm.com/itso/webservices.nsf/ UserInfo?WSDL"); String soapAction ="http://domino7appdev.cam.itso.ibm.com/itso/webservices.nsf/ UserInfo?WSDL"; Call call = new Call(); SOAPHTTPConnection hc = new SOAPHTTPConnection(); hc.setUserName(userName); hc.setPassword(password); call.setSOAPTransport(hc); SOAPMappingRegistry smRegistry = new SOAPMappingRegistry(); String targetNamespace = "urn:DefaultNamespace"; call.setSOAPMappingRegistry(smRegistry); call.setTargetObjectURI(targetNamespace); call.setMethodName("getUserName"); call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC); Response resp = null; try { resp = call.invoke(url, soapAction); } catch (SOAPException e) { e.printStackTrace(); return ("SOAP Exception code: " + e.getFaultCode() + " message: " + e.getMessage()); } if (!resp.generatedFault()) { Parameter ret = resp.getReturnValue(); return ret.getValue() + ""; } else { Fault fault = resp.getFault(); return ("SOAP Fault, " + fault.getFaultCode() + " " + fault. getFaultString()); } } catch (Exception e) { e.printStackTrace(); } return null; } }Пример 3.16. Код Java, необходимый для использования Web-сервисов средой LS2J
3.12.4 Создание агента, используя язык LotusScript
Наконец нам необходимо создать агент LotusScript и использовать только что созданную библиотеку через LS2J.
- В панели Navigation выберите Shared Code => Agents.
- Щелкните по кнопке New Agent. В окне свойств нового агента, в поле Name, введите LotusScriptConsumeWS, а в выпадающем списке Target раздела Runtime выберите None. Закройте окно свойств.
- Измените язык на LotusScript.
- В Declarations замените код по умолчанию кодом, приведенным в примере 3.17.
- В Initialize замените код по умолчанию кодом из примера 3.18.Замечание Скорректируйте строчку value = myObject.getValue("The UserName", "The Password"), введя правильное имя пользователя и пароль.
Option Public Use "ConsumeWSLibrary" Uselsx "*javacon"
Пример 3.17. Код Declaration для агента LotusScript LS2JSub Initialize Dim mySession As JavaSession Dim myClass As JavaClass Dim myObject As JavaObject Set mySession = New JavaSession () Set myClass = mySession.GetClass("WSConsumer") Set myObject = myClass.CreateObject Dim value As String value = myObject.getValue("The UserName", "The Password") Msgbox value End Sub
Пример 3.18. Код Initialize для агента LotusScript LS2J - Сохраните и закройте агент.
- В клиенте Lotus Notes запустите только что созданный агент. Если вы увидите сообщение, которое представлено на рис. 3.21, то оно, скорее всего, вызвано тем, что вы не обеспечили код точным именем пользователя и паролем.
Если агент смог использовать ваш Web-сервис, вы увидите сообщение, представленное на рис. 3.22.
3.12.5 Аутентификация и Web-сервисы
В Lotus Notes и Domino 7 Web-сервис обладает теми же возможностями защиты, что и агент. В примере 3.19 мы использовали базовую аутентификацию HTTP, для того чтобы защитить наш Web-сервис. Apache SOAP позволяет нам отправлять имена пользователей и пароли в виде SOAP-запросов, добавляя экземпляр класса SOAPHTTPConnection к объекту Call.
Call call = new Call(); SOAPHTTPConnection hc = new SOAPHTTPConnection(); hc.setUserName(userName); hc.setPassword(password); call.setSOAPTransport(hc);Пример 3.19. Базовая аутентификация с помощью Apache SOAP
3.13 Какой стиль WSDL мне следует использовать?
В документе WSDL содержится XML-код, который описывает Web-сервис. Привязка WSDL описывает то, как сервис связан с протоколом обмена сообщениями. Привязка WSDL SOAP может быть осуществлена либо при помощи вызова удаленных процедур (RPC), либо при помощи документной привязки. Привязка SOAP также может употребляться как в кодированном виде, так и в литеральном виде. Таким образом, у разработчика приложений Lotus Domino есть четыре типа/моделей использования на выбор:
- вызов удаленных процедур/кодированный (RPC/encoded);
- вызов удаленных процедур/литеральный (RPC/literal);
- документальный/литеральный (Document/literal);
- заключенный в оболочку (Wrapped).
Терминология "RPC против документального" может сбивать с толку, так как эти термины подразумевают, что тип RPC следует использовать для программируемых моделей RPC и что документальный тип нужно использовать для документальных программируемых моделей или для программируемых моделей обмена сообщениями. Тем не менее, в данном случае все эти заблуждения бессмысленны, так как тип не имеет ничего общего с программируемыми моделями. Типы только диктуют то, как переводить привязку WSDL в сообщение SOAP. Подобно этому, типы кодированный и литеральный имеют значение только в привязке WSDL-к-SOAP.