Компания IBM
Опубликован: 04.07.2008 | Доступ: свободный | Студентов: 529 / 63 | Оценка: 4.48 / 4.37 | Длительность: 08:45:00
Лекция 3:

Улучшение работы приложения фирмы ITSO Electronics с помощью Web-сервисов

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >

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. Выполните приведенную ниже последовательность действий.

  1. Откройте базу данных Web Services в Domino Designer.
  2. Щелкните по кнопке New Web Service.
  3. Убедитесь, что установлен язык кода LotusScript.
  4. Перейдите к разделу 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
  5. Откройте окно свойств Web-сервиса и в поле Name и PortType введите UserInfo, как показано на рис. 3.19.
  6. Сохраните и закройте Web-сервис.
Окно свойств LS2J Web Service UserInfo

Рис. 3.19. Окно свойств LS2J Web Service UserInfo

3.12.3 Создание библиотеки скриптов, необходимой для использования Web-сервиса с помощью Java

Теперь нам необходимо создать библиотеку скриптов, содержащую класс Java, который будет использовать Web-сервис и сделает его доступным нашему агенту LotusScript через LS2J. Для того чтобы настроить класс Java, необходимо выполнить следующую последовательность действий:

  1. Откройте базу данных WS Consumer в Domino Designer.
  2. В навигационной панели выберите Shared Code (Общий код) и щелкните по кнопке New Java Library (Новая библиотека Java).
  3. В открывшемся окне щелкните по кнопке Edit Project и выберите файл Apache soap.jar (см. рис. 3.20). Если у вас отсутствует файл Apache soap.jar, необходимо вернуться к "Улучшение работы приложения фирмы ITSO Electronics с помощью Web-сервисов" , "Использование Web-сервисов с помощью Java" для получения дополнительной информации о том, как загрузить Apache SOAP.
  4. Сохраните библиотеку скриптов под именем ConsumeWSLibrary.
  5. Замените код для библиотеки по умолчанию кодом, приведенным в примере 3.16.
Важно Приведенные ниже строчки из примера 3.16 должны быть скорректированы и соответствовать URL вашей базы данных:
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";
Импортирование архива Java, который будет использован с LS2J

увеличить изображение
Рис. 3.20. Импортирование архива Java, который будет использован с LS2J
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.

  1. В панели Navigation выберите Shared Code => Agents.
  2. Щелкните по кнопке New Agent. В окне свойств нового агента, в поле Name, введите LotusScriptConsumeWS, а в выпадающем списке Target раздела Runtime выберите None. Закройте окно свойств.
  3. Измените язык на LotusScript.
  4. В Declarations замените код по умолчанию кодом, приведенным в примере 3.17.
  5. В Initialize замените код по умолчанию кодом из примера 3.18.
    Замечание Скорректируйте строчку value = myObject.getValue("The UserName", "The Password"), введя правильное имя пользователя и пароль.
    Option Public
    Use "ConsumeWSLibrary"
    Uselsx "*javacon"
    Пример 3.17. Код Declaration для агента LotusScript LS2J
    Sub 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
  6. Сохраните и закройте агент.
  7. В клиенте Lotus Notes запустите только что созданный агент. Если вы увидите сообщение, которое представлено на рис. 3.21, то оно, скорее всего, вызвано тем, что вы не обеспечили код точным именем пользователя и паролем.
Сообщение об ошибке, возникшей при использовании Web-сервиса с помощью LS2J

Рис. 3.21. Сообщение об ошибке, возникшей при использовании Web-сервиса с помощью LS2J

Если агент смог использовать ваш Web-сервис, вы увидите сообщение, представленное на рис. 3.22.

Web-сервис был успешно использован с помощью LS2J

Рис. 3.22. Web-сервис был успешно использован с помощью LS2J

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.

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >