Web-служби Lotus Notes / Domino 7, HTML, XML, DHTML, Інтернет-технології, статті

Web-служба – це набір операцій, які виконуються віддалено, які можна викликати, відправляючи повідомлення через інтернет. Постачальник публікує Web-служби і дає можливість використовувати їх, а користувач Web-служб віддалено викликає операції з них. Постачальник Web-служб відкриває доступ до визначального інтерфейс служби документу WSDL (Web Services Description Language). Документ WSDL зберігається в форматі XML. Все, що приховано за інтерфейсом, стосується виключно постачальника, проте більшість постачальників показують інтерфейс аж до викликів процедур на підтримуваному мовою програмування. Вхідні від користувача запити йдуть до прихованого програмного коду, а результат повертається користувачеві.


Lotus Domino відображає інтерфейс WSDL як Web-службу, яка може бути впроваджена в код LotusScript і Java. Для використання Web-служби вона повинна бути розміщена на сервері Domino з відкритим HTTP доступом. (Перевірити роботу Web-служби можна через HTTP-сесію в клієнтському попередньому перегляді Notes.) Доступ здійснюється через одну з наступних команд Domino URL:


У цій статті описано компонент Web-служби в Lotus Notes / Domino 7, наведені приклади в LotusScript і Java. Стаття розрахована на досвідчених розробників в середовищі Notes, знайомих з LotusScript і Java.


Приклад


Наведемо простий приклад. Дано ім’я бази даних, ім’я відображення, а також номер документа; наша операція повертає вміст елемента “Subject”. Назвемо її getNthSubject.

Діаграма getNthSubject

Рис. 1. Діаграма getNthSubject.


Щоб відкрити доступ до операції навколишнього світу, ми публікуємо її в Web-службі під назвою GetSubject. В GetSubject може міститися скільки завгодно операцій. Наприклад, нам можуть знадобитися операції getFirstSubject і getLastSubject. Однак давайте поки що розберемося з нашим прикладом, операцією getNthSubject. Нижче приведена витяг з документа WSDL, що описує містить дану операцію Web-службу. Перегляньте цей лістинг, читаючи коментарі нижче.






<wsdl:message name=
“getNthSubjectRequest”> (4)
<wsdl:part name=”dbname” type=”xsd:string”/> (5)
<wsdl:part name=”viewname” type=”xsd:string”/> (5)
<wsdl:part name=”n” type=”xsd:int”/> (5)
</wsdl:message>
<wsdl:message name=”getNthSubjectResponse”> (4)
<wsdl:part name=”getNthSubjectReturn” type=”xsd:string”/> (6)
</wsdl:message>
<wsdl:portType name=”GetSubjectPortType”> (1)
<wsdl:operation name=”getNthSubject”
parameterOrder=”dbname viewname n”> (2)
<wsdl:input message=”impl:getnthSubjectRequest” name=”
GetNthSubjectRequest”/> (3)
<wsdl:output message=”impl:getNthSubjectResponse” name=”
GetNthSubjectResponse”/> (3)
</wsdl:operation>
</wsdl:portType>

Спочатку погляньте на визначальний набір операцій служби елемент portType(1). У нашої служби тільки один елемент portType з єдиною операцією getNthSubject(2). У операції є два “повідомлення”(3) – Одне для входу, одне для виходу. Повідомлення визначені в елементах message(4). Як ми бачимо, що входить повідомлення складається з трьох частин(5): Два рядки з назвами dbname і viewname, і змінна n типу int. Вихідне повідомлення складається з єдиного рядка під назвою getNthSubjectReturn(6).


Таким чином, у нас є одна операція з трьома вхідними частинами і однієї вихідної, яка досить ясно вказує на процедуру з трьома параметрами тільки для читання і одним повертається значенням. В LotusScript така процедура була б визначена наступною функцією:


Public Function getNthSubject(dbname As String, viewname As String, n As Long) As String

І в Java наступним методом:


public String getNthSubject(String dbname, String viewname, int n)

Компонент Web-служби


Для створення компонента Web-служби в Domino Designer є кілька шляхів. Ми можемо написати його безпосередньо в LotusScript або Java. В такому випадку при збереженні компонента генерується документ WSDL, відображає код LotusScript або Java. Або ж ми можемо імпортувати вже існуючий документ WSDL. У цьому випадку відповідно до виконуваних в WSDL операціями генеруються LotusScript або Java. У компоненті Web-служби зберігається як код, так і документ WSDL. Якщо публічний інтерфейс не змінюється, документ WSDL теж залишається як є. Якщо ж в нашому коді ми міняємо щось змінює публічний інтерфейс, то зміниться і WSDL.


В Domino Designer компонент Web-служби знаходиться під закладкою Agents в закладці Shared Code. Вікно конструктора Web-служби дуже схоже на вікно конструктора агента. Щоб створити нову Web-службу, натисніть на кнопку New Web Service. Для редагування вже існуючої Web-служби двічі клацніть по ній.

Нова Web-служба

Рис. 2. Нова Web-служба


У вікні властивостей Web-служби, як і у вікні агента, три закладки. Ось основна закладка:

Вікно властивостей Web-служби

Рис. 3. Вікно властивостей Web-служби


Поле name (ім’я) має бути заповнено, а поля Alias ​​(псевдонім) і Comment (коментар) можна не заповнювати. Також ви можете вибрати, чи необхідно попереджати вас в тому випадку, якщо в результаті зміни програмного коду буде генеруватися новий WSDL.


Клас PortType – це ім’я класу, що визначає процедури, які будуть використані в якості операцій WSDL. Ці процедури мають бути публічними функціями LotusScript або методами Java. Закриті функції і методи не можна відобразити через інтерфейс Web-служби. У вікні властивостей вибрати клас PortType неможливо до тих пір, поки ми не створили клас, написавши код, або поки ми не проімпортіровалі WSDL. Незабаром ми познайомимося з кодом ближче.


Закладка Security (безпека) майже така ж, як і в агентів, детальніше ми її обговоримо пізніше.


У закладці Advanced (додатково) міститься додаткова інформація для визначення Web-служби і генерації WSDL. Детальніше ми її обговоримо пізніше.


Вікно редактора таке ж, як і в агентів. Справа меню, що випадає, в якому можна вибрати LotusScript або Java. На малюнку нижче обрана Java. Зліва вікно об’єктів і посилань.

Web-служба (Java)

Рис. 4. Web-служба (Java)


Щоб створити нову Web-службу, спираючись на вже існуючий WSDL-документ, використовуйте кнопку Import WSDL (Імпорт WSDL). Кнопка Show WSDL компілює будь внесені в Web-службу зміни і показує відображає її публічний інтерфейс документ WSDL. Кнопка Export WSDL компілює будь внесені в Web-службу зміни і експортує відображає її публічний інтерфейс документ WSDL. Також компіляція запускається при збереженні або закриття Web-служби. WSDL заново генерується тільки у разі зміни публічного інтерфейсу.


Основи написання коду


Код Web-служби містить такі елементи:


Нижче наведено шаблон коду LotusScript з Web-службою, яка містить одну операцію. Це та сама операція з трьома вхідними параметрами та одним вихідним з прикладу вище.






Option Public
%INCLUDE “lsxsd.lss”
Dim s As NotesSession
Class GetSubject
Sub NEW
Set s = New NotesSession
End Sub
Function getNthSubject(dbname As String, viewname As String, n As Long) As String
! Code for doing the operation goes here
End Function
End Class

А тут наведено шаблон коду Java з сос Web-службою, яка містить одну операцію. Конструктором повинен бути конструктор за замовчуванням (без параметрів). Решта конструктори ігноруються.






import lotus.domino.*;
import lotus.domino.types.*;
public class GetSubject {
Session s;
public GetSubject() {
s = WebServiceBase.getCurrentSession();
}
public String getNthSubject(String dbname, String viewname, int n) { / / Тут починає код для виконання операції
}
}

Тепер ми розширимо приклади, включивши в них робочий код. Нижче слід приклад LotusScript:






Option Public
%INCLUDE “lsxsd.lss”
Dim s As NotesSession
Class GetSubject
Sub NEW
Set s = New NotesSession
End Sub
Function getNthSubject(dbname As String, viewname As String, n As Long) As String
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Set db = s.GetDatabase(“”, dbname)
If Not(db.IsOpen) Then
getNthSubject = “Cannot open database ” & dbname
Exit Function
End If
Set view = db.GetView(viewname)
If view Is Nothing Then
getNthSubject = “Cannot open view ” & viewname
Exit Function
End If
Set doc = view.GetNthDocument(n)
If doc Is Nothing Then
getNthSubject = “Cannot get document ” & n
Exit Function
End If
If doc.HasItem(“Subject”) Then
getNthSubject = doc.GetItemValue(“Subject”)(0)
Else
getNthSubject = “Document does not have Subject”
End If
End Function
End Class

Далі слід приклад на Java:






import lotus.domino.*;
import lotus.domino.types.*;
public class GetSubject {
Session s;
public GetSubject() {
s = WebServiceBase.getCurrentSession();
}
public String getNthSubject(String dbname, String viewname, int n) {
String subject = null;
try {
Database db = s.getDatabase(null, dbname);
if (!db.isOpen()) subject = “Cannot open database ” + dbname;
else {
View view = db.getView(viewname);
if (view == null) subject = “Cannot open view ” + viewname;
else {
Document doc = view.getNthDocument(n);
if (doc == null) subject = “Cannot get document ” + n;
else {
if (doc.hasItem(“Subject”))
subject = doc.getItemValueString(“Subject”);
else subject = “Document does not have Subject”;
}
}
}
}
catch(Exception e) {
subject = e.toString();
e.printStackTrace();
}
return subject;
}
}

Звернення до Web-службі і перевірка її працездатності


По-перше, Web-служба повинна знаходитися на сервері Domino 7 з працюючим HTTP-протоколом. Ми можемо перевірити роботу елемента Web-служби, що знаходиться в Domino Designer. На початку необхідно в браузері або де-небудь ще (в формі, наприклад) вибрати Design – Preview, ніж запускається протокол HTTP. Якщо користувач знаходиться на тому ж комп’ютері, де і клієнтська програма Notes, як адреса комп’ютера використовуйте 127.0.0.1. Діючи в якості користувача, в адресному рядку ми посилаємо SOAP-повідомлення в запиті до Web-службі Domino по протоколу HTTP POST. Адресна рядок повинен виглядати приблизно так:


http://rperron300pl.notesdev.ibm.com/Webservices2.nsf/GetSubject?OpenWebService

SOAP-повідомлення має виглядати приблизно так:






<SOAP-ENV:Envelope
ENV=”http://schemas.xmlsoap.org/soap/envelope/”
xmlns:xsd=”http://www.w3.org/2001/XMLSchema”
xmlns:xsd=”http://www.w3.org/2001/XMLSchema”
<SOAP-ENV:Body>
<ns0:getNthSubject (1)
SOAP-ENV:encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/”
xmlns:ns0=”urn:DefaultNamespace”>
<dbname xsi:type=”xsd:string”>Webservices2</dbname> (2)
<viewname xsi:type=”xsd:string”>Main View</viewname> (2)
<n xsi:type=”xsd:int”>2</n> (2)
</ns0:getNthSubject>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

У даному прикладі в SOAP-повідомленні визначена виконувана операція і вхідні значення для неї. Специфічні елементи, на зразок SOAP-ENV: body визначені правилами побудови WSDL, зокрема – форматом SOAP-повідомлення (Див. розділ нижче “Додаткові властивості” для отримання більш детальної інформації).


У WebSphere SDK для Web-служб є інструмент для створення запитів до Web-служб та перегляду результатів. Цей SDK працює під Eclipse. Повинні бути встановлені:


TWebSphere SDK на момент написання статті не працює з Eclipse 3.0. Крім того, для створення запитів можна використовувати WebSphere Studio Application Developer. Останньою є версія 5.1.2


Щоб використовувати WebSphere SDK, запустіть Web Service Explorer (браузер Web-служб) через Run – Launch. Після завантаження браузера Web-служб:


  1. Клацніть на іконці WSDL Page (сторінка WSDL). Це третя іконка від показує направо стрілочки праворуч зверху. На панелі навігації зліва з’явиться посилання WSDL Main.
  2. Тисніть на посилання WSDL Main. На правій панелі з’явиться поле для введення “Open WSDL”.
  3. Введіть адресу Web-служби з командою? WSDL, наприклад, http://rperron300pl.notesdev.ibm.com/Webservices2.nsf/GetSubject?WSDL, І клацайте на Go. На даному етапі браузер Web-служб повинен прочитати документ WSDL, тому ми використовуємо? WSDL, а не? OpenWebService.
  4. На правій панелі з’явиться меню з пов’язаної інформацією WSDL. У ньому містяться посилання на операції, визначені Web-службою.
  5. Клацніть на імені операції, наприклад, getNthSubject. З’явиться діалогове вікно “Створити запит до операції WSDL”.
  6. Вводите значення параметрів і клацайте на Go.

Відповідь приходить в нижнє вікно (Status). Ось як може виглядати браузер Web-служб після звернення до Web-службі з прикладу.

Браузер Web-служб

Рис. 5. Браузер Web-служб


У вікні Actions (дії) справа зверху є посилання на Source (джерело). Клік на Source показує відповідне SOAP-повідомлення. Його можна змінити, а потім передати, клацнувши на Go. Клацніть на Form справа вгорі, щоб повернути вікно в початковий стан. У вікні статусу теж є посилання на джерело, що дозволяє побачити відповідь SOAP. Якщо там говориться що відображати нічого (а відповідь має бути) – то наш код, швидше за все, не спрацював.


Після запуску Web-служби перевірте, чи є повідомлення про помилки в серверній консолі або файлі log.nsf. Ми можемо робити налагодження, включаючи в код повідомлення MessageBox, які відображаються на серверної консолі або в log.nsf. (Не використовуйте в Beta 2 виразів Print – вони надходять в потік HTTP і спотворюють відгук SOAP.)


Додаткові властивості


У вкладці Advanced (Додатково) містяться налаштування, що визначають Web-служби і відбиваються в документі WSDL.

Вкладка додаткових налаштувань вікна властивостей Web-служби

Рис. 6. Вкладка додаткових налаштувань вікна властивостей Web-служби


Ми можемо вказати імена для типу порту, елемента служби і порту служби. Наприклад, можемо вказати всі імена як GetSubject. Для більшої ясності суфіксом служить тип елемента. Зазначені імена вставляються в документ WSDL. При імпорті документа імена у вікно налаштувань беруться з нього.


Нижче – повний документ WSDL з прикладу GetSubject. Відзначено ті частини, які відображені в додаткових настройках.






<?xml version=”1.0″
encoding=”UTF-8″?> <wsdl:definitions
targetNamespace=”urn:DefaultNamespace”
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”>
<wsdl:message name=”getNthSubjectResponse”>
<wsdl:part name=”getNthSubjectReturn” type=
“xsd:string”/> (6)
</wsdl:message>
<wsdl:message name=”getNthSubjectRequest”>
<wsdl:part name=”dbname” type=
“xsd:string”/> (6)
<wsdl:part name=”viewname” type=
“xsd:string”/> (6)
<wsdl:part name=”n” type=”xsd:int”
/> (6)
</wsdl:message>
<wsdl:portType name=”GetSubjectPortType”> (1)
<wsdl:operation name=”getNthSubject”
parameterOrder=”dbname viewname n”>
<wsdl:input message=”impl:getNthSubjectRequest”
name=”getNthSubjectRequest”/>
<wsdl:output message=”impl:getNthSubjectResponse”
name=”getNthSubjectResponse”/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name=”GetSubjectPortSoapBinding”
type=”impl:GetSubjectPortType”>
<wsdlsoap:binding style=”rpc” (4)
transport=”http://schemas.xmlsoap.org/soap/http”/>
<wsdl:operation name=”getNthSubject”>
<wsdlsoap:operation soapAction=””/> (7)
<wsdl:input name=”getNthSubjectRequest”>
<wsdlsoap:body
encodingStyle=”http://schemas.xmlsoap.org/soap/
encoding/” (5)
namespace=”urn:DefaultNamespace” use=
“encoded”/> (5)
</wsdl:input>
<wsdl:output name=”getNthSubjectResponse”>
<wsdlsoap:body
encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/
” (5)
namespace=”urn:DefaultNamespace” use=
“encoded”/> (5)
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name=”GetSubjectElement”> (2)
<wsdl:port binding=”impl:GetSubjectPortSoapBinding”
name=”GetSubjectPort”> (3)
<wsdlsoap:address location=”http://localhost”/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

(1) Типом порту визначається набір операцій. Атрибут wsdl: portType з документа WSDL відповідає параметру Port type name (ім’я типу порту) в додаткових настройках.

(2) У службі визначені підтримувані порти. Атрибут wsdlsoap: address в документі відповідає параметру Service element name (ім’я елемента служби) у вкладці з настройками. Якщо документ WSDL був отриманий через Export WSDL, Show WSDL або попередній перегляд в Domino Designer, то атрибут location (місцезнаходження) параметра wsdlsoap: address містить некоректні дані, вони правильні в разі отримання WSDL документа URL-командою? WSDL.

(3) Портом вказується зв’язок, який в свою чергу визначає тип порту і дає доступ до додаткової інформації. У документі WSDL всередині атрибута wsdl: service міститься атрибут з ім’ям порту wsdl: port. В Domino може бути вказана одна служба і в кожній службі – один порт.

(4) Можна вибрати з двох режимів програмування і чотирьох форматів SOAP-повідомлень. Режим програмування RPC допускає використання чотирьох форматів SOAP-повідомлень: RPC / шифровані, RPC / символьні, Doc / символьні і Wrapped (приховані) (п’ятий можливий формат, Doc / шифрований, не до кінця зрозумілий, а тому не використовується тут). У режимі програмування Message автоматично включається формат Doc / символьний, але це тільки в якості натяку; реальний формат SOAP-повідомлення, що проходить на працюючу в режимі Message Web-службу, не публікується, а встановлюється за особистою домовленістю між постачальником і користувачем. Атрибут style (стиль) в wsdlsoap: binding встановлюється наступним чином:


(5) В елементах input і output в wsdlsoap: binding елемент use wsdl: soap: body встановлюється наступним чином:


(6) В RPC / шифрованих і RPC / символьних в кожній частині повідомлення тип даних визначається прямим посиланням на простір імен XMLSchema (наприклад, type = “xsd: string” або type = “xsd: int”) або комплексний тип, визначений в секції “types” документа WSDL (у прикладі цього немає).


В Doc / символьних кожна частина повідомлення відноситься до раніше визначеного елементу даних. Нижче наведено приклад з документа WSDL із зазначеним Doc / символьним форматом. В wsdl: types кожна вводиться частина визначена в елементі, зазначеному після відповідного параметра процедурного коду або виводиться частина визначена в елементі, зазначеному після процедури і Return.






<wsdl:types>
<schema targetNamespace=”urn:DefaultNamespace”
xmlns=”http://www.w3.org/2001/XMLSchema”>
<element name=”dbname” type=”xsd:string”/>
<element name=”viewname” type=”xsd:string”/>
<element name=”n” type=”xsd:int”/>
<element name=”getNthSubjectReturn” type=”xsd:string”/>
</schema>
</wsdl:types>
<wsdl:message name=”getNthSubjectResponse”>
<wsdl:part element=”impl:getNthSubjectReturn”
name=”getNthSubjectReturn”/>
</wsdl:message>
<wsdl:message name=”getNthSubjectRequest”>
<wsdl:part element=”impl:dbname” name=”dbname”/>
<wsdl:part element=”impl:viewname” name=”viewname”/>
<wsdl:part element=”impl:n” name=”n”/>
</wsdl:message>

Щоб бути закритою, для кожного повідомлення одна частина, названа відповідно до використовує її операцією і не має, відноситься до попередньо визначеного елементу типу complexType. Нижче наведено уривок коду WSDL в прихованому форматі.






<wsdl:types>
<schema targetNamespace=”urn:DefaultNamespace”
xmlns=”http://www.w3.org/2001/XMLSchema”>
<element name=”getNthSubject”>
<complexType>
<sequence>
<element name=”dbname” type=”xsd:string”/>
<element name=”viewname” type=”xsd:string”/>
<element name=”n” type=”xsd:int”/>
</sequence>
</complexType>
</element>
<element name=”getNthSubjectResponse”>
<complexType>
<sequence>
<element name=”getNthSubjectReturn” type=”xsd:string”/>
</sequence>
</complexType>
</element>
</schema>
</wsdl:types>
<wsdl:message name=”getNthSubjectResponse”>
<wsdl:part element=”impl:getNthSubjectResponse” name=”parameters”/>
</wsdl:message>
<wsdl:message name=”getNthSubjectRequest”>
<wsdl:part element=”impl:getNthSubject” name=”parameters”/>
</wsdl:message>

Чудове розгляд форматів SOAP ви можете знайти в статті developerWorks “Який стиль WSDL мені використовувати?“Автор Расселл Батеке (Russell Butek).


(7) параметр soapAction = “” якщо не стоїть галочка на “Включити ім’я операції в дію SOAP”. Якщо цей параметр вибрано, то в soapAction вказується ім’я операції, наприклад:


<wsdlsoap:operation soapAction=”getNthSubject”/>

Безпека


Установки безпеки Web-служб аналогічні запитуваною через інтернет серверним агентам. Нижче наведено приклад вкладки безпека (security) вікна налаштувань Web-служб.

Вкладка безпеки вікна властивостей Web-служби

Рис. 7. Вкладка безпеки вікна властивостей Web-служби


Першими двома рядками визначається, хто є фактичним користувачем Web-служби. Якщо вони не заповнені, то фактичним користувачем є господар Web-служби (останній користувач, редагував її елементи).


У користувача Web-служби повинен бути відкритий доступ до сервера. Якщо анонімний доступ дозволений на HTTP-порту, то доступ проводиться автоматично. Інакше користувач повинен ідентифікуватися дійсними ім’ям і паролем. У базі даних фактичному користувачеві повинен бути наданий доступ на вхід з допуском до читання спільних документів.


“Компілювати код Java з налагоджування” допускає приєднання до Web-службі отладчика Java, начебто підтримує JPDA (налагоджувальну архітектуру для Java-платформ) Eclipse. Java-налагодження з’явилася тольков версії 7 і працює виключно з клієнтом Notes. Тобто, для налагодження Web-служба повинна бути розміщена на клієнті Notes. Запустіть процес HTTP на клієнті, вибравши в браузері Design – Preview. Викличте Web-службу. У Web-службі повинен міститися код тільки для налагодження, який призупиняє роботу служби на якийсь час. Після цього підключайте відладчик до працюючої Web-службі.


У Web-службах на LotusScript замість отладочной рядка Java є опція “Допускати віддалену налагодження”. Дистанційна налагодження у Web-служб така ж, як і в агентів. В цьому випадку Web-служба повинна знаходитися на сервері.


Опцією “Зібрати інформацію по Web-службі” включається збір витрачених Domino Objects відрізків часу. Переглянути результати обраної Web-служби можна, вибравши Design-View Profile Results. Збір інформації новий в 7-ої версії і працює як з Web-службами, так і з написаними на LotusScript або Java агентами.


Опцією “Встановити рівень безпеки на час роботи” допускаються три рівні безпеки. Рівні з вищими номерами допускають виконання потенційно небезпечних дій, таких як запис у файлову систему або маніпулювання змінними середовища.


Опцією “Доступ до служби за замовчуванням” ми можемо дозволити використання служби всім, або перерахувати дозволених користувачів.


Контекстна середу Web-служб


Будова Web-служб таке ж, як і в агентів. З іншого боку, більшість контексту агентів, проте не весь, застосовно до Web-служб. Ми вже бачили, як отримати об’єкти Session і AgentContext в Java і NotesSession в LotusScript. Ось інші основні контекстні елементи, що застосовуються до Web-служб:
























































Contextual element 

Java 

LotusScript 

Поточна Web-служба AgentContext.getCurrentAgent(); NotesSession.CurrentAgent
Поточна база даних AgentContext.getCurrentDatabase(); NotesSession.CurrentDatabase
Висновок на серверну консоль і log.nsf System.out Messagebox
Ім’я і псевдонім Web-служби Agent.getName(); NotesAgent.Name
Господар Web-служби (повне ім’я) Agent.getOwner(); NotesAgent.Owner
Господар Web-служби (внутрішнє ім’я) Agent.getCommonOwner(); NotesAgent.CommonOwner
Господар Web-служби зараз Agent.getOnBehalfOf(); NotesAgent.OnBehalfOf
Коментар до Web-службі Agent.getComment(); NotesAgent.Comment
HTTP URL Web-служби Agent.getHttpURL(); NotesAgent.HttpURL
Notes URL Web-служби Agent.getNotesURL(); NotesAgent.NotesURL
Батьківська бд Web-служби Agent.getParent(); NotesAgent.Parent
Тримачі шлюзів Web-служби Agent.getLockHolders(); NotesAgent.LockHolders


Елементи Web-служби можуть бути закриті і відкриті так само, як і агенти.


Тут наведено приклад LotusScript, що демонструє отримання властивостей, пов’язаних з контекстом Web-служби. У Web-службі 3 операції.






Option Public
%INCLUDE “lsxsd.lss”
Dim s As NotesSession
Dim agent As NotesAgent
Class GetAgentContext
Sub NEW
Set s = New NotesSession
Set agent = s.CurrentAgent
End Sub
Function getAgentName() As String
getAgentName = agent.Name
End Function
Function getEffectiveUserName() As String
getEffectiveUserName = s.EffectiveUserName
End Function
Function getDatabaseFileName() As String
Dim db As NotesDatabase
Set db = s.CurrentDatabase
getDatabaseFileName = db.FileName
End Function
End Class

Нижче наведено код Java.






import lotus.domino.*;
import lotus.domino.types.*;
public class GetAgentContext {
Session s;
AgentContext ac;
public GetAgentContext() {
s = WebServiceBase.getCurrentSession();
try {
ac = s.getAgentContext();
} catch(Exception e) {
e.printStackTrace(); }
}
public java.lang.String getAgentName() {
String agentName = null;
try {
Agent agent = ac.getCurrentAgent();
agentName = agent.getName(); }
catch(Exception e) {
e.printStackTrace(); }
return agentName;
}
public java.lang.String getEffectiveUserName() {
String userName = null;
try {
userName = ac.getEffectiveUserName(); }
catch(Exception e) {
e.printStackTrace(); }
return userName;
}
public java.lang.String getCurrentDatabase() {
String dbFileName = null;
try {
Database db = ac.getCurrentDatabase();
dbFileName = db.getFileName(); }
catch(Exception e) {
e.printStackTrace(); }
return dbFileName;
}
}

Складні типи даних


Операції, що працюють за такою моделлю, не потребують складних типах даних:


Операції, які повертають більше одного скалярного значення, чи потребують більш ніж скалярні значення на вході, потребують складних типах даних. Використання складних типів даних дозволяє переміщати великі і різнорідні структури даних.


В наступних секціях розглянуті складні типи даних:


Масиви
Масиви відображаються в елемент WSDL complexType і називаються ArrayOf з суфіксом, що позначає тип даних. Елемент complexType в WSDL визначений як масив.


Наприклад, виконана на Java операція з прикладу повертає масив з рядків.






public java.lang.String[] getAll() {
String[] info = new String[3];
try {
info[0] = ac.getEffectiveUserName();
info[1] = s.getPlatform();
info[2] = s.getNotesVersion(); }
catch(Exception e) {
e.printStackTrace(); }
return info;
}

Масив типу String в Java відповідає певному як масив з рядків елементу complexType WSDL ArrayOf_xsd_string. У визначальному повертається значення операції getAll (getAllResponse) повідомленні вказана одна частина типу ArrayOf_xsd_string.






– <wsdl:types>
– <schema targetNamespace=”urn:DefaultNamespace”
xmlns=”http://www.w3.org/2001/XMLSchema”>
<import namespace=”http://schemas.xmlsoap.org/soap/encoding/” />
– <complexType name=”ArrayOf_xsd_string”>
– <complexContent>
– <restriction base=”soapenc:Array”>
<attribute ref=”soapenc:arrayType”
wsdl:arrayType=”xsd:string[]” />
</restriction>
</complexContent>
</complexType>
</schema>
</wsdl:types>
– <wsdl:message name=”getAllResponse”>
<wsdl:part name=”getAllReturn” type=”impl:ArrayOf_xsd_string” />
</wsdl:message>

В LotusScript ми не можемо повернути масив користувачеві Web-служби. Правилами мови передбачається, що повертається значення-масив має бути визначено як Variant, а цей тип дає недостатньо інформації для інтерпретації при генерації WSDL. Доводиться йти обхідним шляхом, поміщаючи масив в клас, як показано нижче.






Option Public
%INCLUDE “lsxsd.lss”
Dim s As NotesSession
Class infoArray
Public info() As String
End Class
Class GetSessionInfo
Sub NEW
Set s = New NotesSession
End Sub
Function getItAll() As infoArray
Set getItAll = New infoArray
Redim getItAll.info(1 To 3)
getItAll.info(1) = s.EffectiveUserName
getItAll.info(2) = s.Platform
getItAll.info(3) = s.NotesVersion
End Function
End Class

Класи
Класи відповідають елементу WSDL complexType, названому відповідно до назви класу. Далі слід приклад на мові Java, який повертає той самий результат, але вже в якості об’єкта, а не масиву.






public InfoClass getAll2() {
InfoClass info = new InfoClass();
try {
info.effectiveUserName = ac.getEffectiveUserName();
info.platform = s.getPlatform();
info.notesVersion = s.getNotesVersion(); }
catch(Exception e) {
e.printStackTrace(); }
return info;
}
public class InfoClass {
public String effectiveUserName;
public String platform;
public String notesVersion;
}

Клас InfoClass в Java відповідає елементу complexType з такою ж назвою. ComplexType містить три елементи типу xsd: string з такими ж назвами, як і у публічних елементів даних в класі InfoClass в Java.






– <wsdl:types>
– <schema targetNamespace=”urn:DefaultNamespace”
xmlns=”http://www.w3.org/2001/XMLSchema”>
<import namespace=”http://schemas.xmlsoap.org/soap/encoding/” />
– <complexType name=”InfoClass”>
– <sequence>
<element name=”notesVersion”
nillable=”true” type=”xsd:string” />
<element name=”platform”
nillable=”true” type=”xsd:string” />
<element name=”effectiveUserName”
nillable=”true” type=”xsd:string” />
</sequence>
</complexType>
</schema>
</wsdl:types>
– <wsdl:message name=”getAll2Response”>
<wsdl:part name=”getAll2Return” type=”impl:InfoClass” />
</wsdl:message>

А ось еквівалент на LotusScript:






Option Public
%INCLUDE “lsxsd.lss”
Dim s As NotesSession
Class InfoClass
Public EffectiveUserName As String
Public Platform As String
Public NotesVersion As String
End Class
Class GetSessionInfo
Sub NEW
Set s = New NotesSession
End Sub
Function getItAll2() As InfoClass
Set getItAll2 = New InfoClass
getItAll2.EffectiveUserName = s.EffectiveUserName
getItAll2.Platform = s.Platform
getItAll2.NotesVersion = s.NotesVersion
End Function
End Class

Скрин.звор-повертаються і повертаються параметри.
Там, де повертається значення функції складається з однієї простої або комплексної частини, воно відповідає повертається значенням функції або методу. Там, де воно складається з декількох частин, що повертається значення передається як через параметри, так і через повертається значення функції. Точний розподіл залежить від вхідних значень і того, як вони комбінуються з вихідними. Наприклад, якщо з повертаються значення перше не відповідає жодному з параметрів, а решта відповідають, то перше стає повертається значенням функції або методу, а решта – Скрин.звор-повертаються параметрами.


Іншими словами, що збігаються вхідні і вихідні частини стають Скрин.звор / повертаними параметрами, що не збігаються вхідні стають вхідними, а неспівпадаючі повертаються – повертаються параметрами. В цьому випадку немає значення, що повертається, і замість функцій в LotusScript використовуються підпрограми.


Тут WSDL з першого прикладу повертає дані у вхідних параметрах:






– <wsdl:message name=”getNthSubjectResponse”>
<wsdl:part name=”getNthSubjectReturn” type=”xsd:string” /> (1)
<wsdl:part name=”dbname” type=”xsd:string” /> (2)
<wsdl:part name=”viewname” type=”xsd:string” /> (3)
<wsdl:part name=”n” type=”xsd:int” /> (4)
</wsdl:message>
– <wsdl:message name=”getNthSubjectRequest”>
<wsdl:part name=”dbname” type=”xsd:string” /> (2)
<wsdl:part name=”viewname” type=”xsd:string” /> (3)
<wsdl:part name=”n” type=”xsd:int” /> (4)
</wsdl:message>

(1)Одне з повертаються значень, getNthSubjectReturn, не збігається з жодним з параметрів. Це значення повертається як значення методу або функції. Інші три повертаються частини. (2) (3) (4) ), Dbname, viewname і n відповідають параметрам. Вони стають трьома Скрин.звор-повертаються параметрами.


Скрин.звор / повертаються і повертаються параметри можуть належати до простих типів даних. У стандартному Java є містить методи для використання Скрин.звор-повертаються і повертаються параметрів різних типів пакет javax.xml.rpc.holders. У Lotus Domino Скрин.звор-повертаються і повертаються параметри відповідають нижче вказаними класами.
































BigDecimalHolder CalendarHolder LongHolder
BigIntegerHolder DoubleHolder LongWrapperHolder
BooleanHolder DoubleWrapperHolder ObjectHolder
BooleanWrapperHolder FloatHolder QNameHolder
ByteArrayHolder FloatWrapperHolder ShortHolder
ByteHolder IntegerWrapperHolder ShortWrapperHolder
ByteWrapperHolder IntHolder StringHolder


У цих класах міститься публічна мінлива value (значення), яку можна отримати і поміняти методами класу. У наступному прикладі представлений варіант операції getNthSubject; як і раніше, вона повертає об’єкт типу String, однак тепер, завдяки використанню класів StringHolder і IntHolder три параметри стають Скрин.звор-повертаються. Значення параметрів повертаються користувачу у відповідному повідомленні SOAP.






import lotus.domino.*;
import lotus.domino.types.*;
public class GetSubject {
Session s;
public GetSubject() {
s = WebServiceBase.getCurrentSession();
}
public String getNthSubject(javax.xml.rpc.holders.StringHolder dbname,
javax.xml.rpc.holders.StringHolder viewname,
javax.xml.rpc.holders.IntHolder n) {
String subject = null;
try {
Database db = s.getDatabase(null, dbname.value);
if (!db.isOpen()) subject = “Cannot open database ” + dbname.value;
else {
View view = db.getView(viewname.value);
if (view == null) subject = “Cannot open view ” + viewname.value;
else {
Document doc = view.getNthDocument(n.value);
if (doc == null) subject = “Cannot get document ” + n.value;
else {
if (doc.hasItem(“Subject”))
subject = doc.getItemValueString(“Subject”);
else subject = “Document does not have Subject”;
}
}
}
}
catch(Exception e) {
e.printStackTrace();
}
return subject;
}
}

В LotusScript під включається файлі lsxsd.lss визначені класи-тримачі для Скрин.звор-повертаються і повертаються параметрів.




























BOOLEAN_HOLDER LONG_HOLDER
BOOLEANARRAY_HOLDER LONGARRAY_HOLDER
BYTE_HOLDER SINGLE_HOLDER
BYTEARRAY_HOLDER SINGLEARRAY_HOLDER
DOUBLE_HOLDER STRING_HOLDER
DOUBLEARRAY_HOLDER STRINGARRAY_HOLDER
INTEGER_HOLDER VARIANT_HOLDER
INTEGERARRAY_HOLDER VARIANTARRAY_HOLDER


У цих класах міститься публічна мінлива value (значення), яку можна отримати і поміняти методами класу. Наступний приклад на LotusScript робить те ж, що і попередній на Java. Для трьох Скрин.звор-повертаються параметрів використані класи-власники.






Option Public
%INCLUDE “lsxsd.lss”
Dim s As NotesSession
Class GetSubject
Sub NEW
Set s = New NotesSession
End Sub
Function getNthSubject(dbname As String_Holder, _
viewname As String_Holder, _
n As Long_Holder) As String
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Set db = s.GetDatabase(“”, dbname.Value)
If Not(db.IsOpen) Then
getNthSubject = “Cannot open database ” & _
dbname.Value
Exit Function
End If
Set view = db.GetView(viewname.Value)
If view Is Nothing Then
getNthSubject = “Cannot open view ” & _
viewname.Value
Exit Function
End If
Set doc = view.GetNthDocument(n.Value)
If doc Is Nothing Then
getNthSubject = “Cannot get document ” & _
n.Value
Exit Function
End If
If doc.HasItem(“Subject”) Then
getNthSubject = doc.GetItemValue(“Subject”)(0)
Else
getNthSubject = “Document does not have Subject”
End If
End Function
End Class

Перетворення типів даних


Прості типи даних та їх аналоги в XSD зазвичай відповідають один одному. За винятком імпортованим типам даних SOAPENC, які перетворюються в об’єкти. Однак при генерації WSDL об’єкт перетворюється в тип даних XSD.








































































Проімпортірованний WSDL   Тип даних в Java
Тип даних в LotusScript
 
Згенерований WSDL  
xsd:boolean boolean
Boolean
xsd:boolean
soapenc:boolean java.lang.Boolean
XSD_BOOLEAN (1) 
xsd:boolean
xsd:byte byte
XSD_BYTE (2) 
xsd:byte
soapenc:byte java.lang.Byte
XSD_BYTE
xsd:byte
xsd:double double
Double
xsd:double
soapenc:double java.lang.Double
XSD_DOUBLE
xsd:double
xsd:float float
Single
xsd:float
soapenc:float java.lang.Float
XSD_FLOAT
xsd:float
xsd:int int
Long
xsd:int
soapenc:int java.lang.Integer
XSD_INT
xsd:int
xsd:long long
XSD_LONG (3)  
xsd:long
soapenc:long java.lang.Long
XSD_LONG
xsd:long
xsd:short short
Integer
xsd:short
soapenc:short java.lang.Short
XSD_SHORT
xsd:short
xsd:string java.lang.String (4)
String
xsd:string
soapenc:string java.lang.String
XSD_STRING
xsd:string


(1) В Java використовуються згорнуті класи, які визначені в java.lang: java.lang.Boolean, java.lang.Byte і т.п. В LotusScript використовуються певні в lsxsd.lss класи XSD_: XSD_BOOLEAN, XSD_BYTE і т.п. Класи в LotusScript успадковують такі методи:


Function GetValueAsString() As String
Sub SetValueAsString(value As String)

Примітка: В очікуваному релізі Beta назву SetValueAsString буде змінено на SetValueFromString.


Нижче наведено приклад операції на Java, повертається значення якої належить до типу java.lang.Boolean.






import lotus.domino.*;
import lotus.domino.types.*;
public class GetDatabaseInfo {
Session s;
AgentContext ac;
Database db;
public GetDatabaseInfo() {
s = WebServiceBase.getCurrentSession();
try {
ac = s.getAgentContext();
db = ac.getCurrentDatabase();
} catch(Exception e) {
e.printStackTrace(); }
}
public Boolean doesViewExist(String viewName) {
Boolean b = null;
try {
if (db.getView(viewName) == null)
b = new Boolean(false);
else
b = new Boolean(true);
} catch(Exception e) {
e.printStackTrace(); }
return b;
}
}

Відповідна операція на LotusScript, що повертає значення типу XSD_BOOLEAN:






Option Public
%INCLUDE “lsxsd.lss”
Dim s As NotesSession
Dim db As NotesDatabase
Class GetDatabaseInfo
Sub NEW
Set s = New NotesSession
Set db = s.CurrentDatabase
End Sub
Function DoesViewExist(viewName As String) As XSD_BOOLEAN
Set b = New XSD_BOOLEAN
If db.GetView(viewName) Is Nothing Then
Call b.SetValueAsString(“False”)
Else
Call b.SetValueAsString(“True”)
End If
Set DoesViewExist = b
End Function
End Class

(2) В LotusScript для xsd: byte не використовується простий тип. Він завжди перетвориться в XSD_BYTE (простий тип в LotusScript перетвориться в xsd: unsignedByte). (3) Також в LotusScript для xsd: long не використовується простий тип. Він завжди перетвориться в XSD_LONG (простий тип в LotusScript відповідає xsd: int. (4) У Java немає простого типу для xsd: string. Він завжди перетвориться в java.lang.String.


Інші типи даних XSD відповідають об’єктам з java.lang, java.math, java.util і lotus.domino.types (нове в Lotus Notes / Domino 7) у Java і XSD_OBJECTS в LotusScript.






















































































































WSDL  Тип даних Java
Тип даних LotusScript
 
xsd:anyType java.lang.Object
XSD_ANYTYPE
Variant (1) 
xsd:anyURI lotus.domino.types.URI
XSD_ANYURI
xsd:base64Binary
soapenc:base64 (2) 
byte[]
xsd:date java.util.Date
XSD_DATE
xsd:dateTime java.util.Calendar
XSD_DATETIME
xsd:decimal
soapenc:decimal (3) 
java.math.BigDecimal
XSD_DECIMAL
xsd:duration lotus.domino.types.Duration
XSD_DURATION
xsd:ENTITY lotus.domino.types.Entity
XSD_ENTITY
xsd:ENTITES lotus.domino.types.Entities
XSD_ENTITIES
xsd:gDay lotus.domino.types.GDay
XSD_GDAY
xsd:gMonth lotus.domino.types.GMonth
XSD_GMONTH
xsd:gMonthDay lotus.domino.types.GMonthDay
XSD_GMONTHDAY
xsd:gYear lotus.domino.types.GYear
XSD_GYEAR
xsd:gYearMonth lotus.domino.types.GYearMonth
XSD_GYEARMONTH
xsd:hexBinary lotus.domino.types.HexBinary
XSD_HEXBINARY
xsd:ID lotus.domino.types.Id
XSD_ID
xsd:IDREF lotus.domino.types.IDRef
XSD_IDREF
xsd:IDREFS lotus.domino.types.IDRefs
XSD_IDREFS
xsd:integer
soapenc:integer (3) 
java.math.BigInteger
XSD_INTEGER
xsd:language lotus.domino.types.Language
XSD_LANGUAGE
xsd:Name lotus.domino.types.Name
XSD_NAME
xsd:NCName lotus.domino.types.NCName
XSD_NCNAME
xsd:negativeInteger lotus.domino.types.NegativeInteger
XSD_NEGATIVEINTEGER
xsd:NMTOKEN lotus.domino.types.NMToken
XSD_NMTOKEN
xsd:NMTOKENS lotus.domino.types.NMTokens
XSD_NMTOKENS
xsd:nonNegativeInteger lotus.domino.types.NonNegativeInteger
XSD_NONNEGATIVEINTEGER
xsd:nonPositiveInteger lotus.domino.types.NonPositiveInteger
XSD_NONPOSITIVEINTEGER
xsd:NOTATION lotus.domino.types.Notation
XSD_NOTATION
xsd:normalizedString lotus.domino.types.NormalizedString
XSD_NORMALIZEDSTRING
xsd:positiveInteger lotus.domino.types.PositiveInteger
XSD_NONPOSITIVEINTEGER
xsd:QName javax.xml.namespace.QName
XSD_QNAME
xsd:time lotus.domino.types.Time
XSD_TIME
xsd:token lotus.domino.types.Token
XSD_TOKEN
xsd:unsignedByte lotus.domino.types.UnsignedByte
Byte
XSD_UNSIGNEDBYTE (4) 
xsd:unsignedInt lotus.domino.types.UnsignedInt
XSD_UNSIGNEDINT
xsd:unsignedLong lotus.domino.types.UnsignedLong
XSD_UNSIGNEDLONG
xsd:unsignedShort lotus.domino.types.UnsignedShort
XSD_UNSIGNEDSHORT


(1) Тип Variant при генерації WSDL перетвориться в xsd: anyType. (2) При імпортуванні з WSDL soapenc: base64 перетвориться в byte [] і Byte. У створеному WSDL завжди перетвориться в xsd: base64Binary. (3) soapenc: decimal і soapenc: integer при імпорті з WSDL перетворюються в XSD: DECIMAL і XSD: INTEGER. У створеному WSDL завжди перетворюються в xsd: decimal і xsd: integer. (4) xsd: unsignedByte при імпорті з WSDL перетвориться в Byte. У створеному WSDL і Byte, і XSD_UNSIGNEDBYTE перетворюються в xsd: unsignedByte.


Власні процедури


У Web-службах Domino відображаються публічні процедури, методи та підпрограми виконуваної частини класу. Власні процедури заховані. Нижче наведено приклад GetSubject, в якому операції getFirstSubject, getLastSubject і getNthSubject відображаються в якості публічних процедур. Виконуваний код міститься у власних процедурах openDatabase, openView і getSubject.






Dim s As NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Dim msg As String
Class GetSubject
Sub NEW
Set s = New NotesSession
End Sub
Function getFirstSubject(dbname As String, viewname As String) As String
If openDatabase(dbname) Then
If openView(viewname) Then
Set doc = view.GetFirstDocument
If doc Is Nothing Then
msg = “Cannot get first document ”
Else
Call getSubject
End If
End If
End If
getFirstSubject = msg
End Function
Function getLastSubject(dbname As String, viewname As String) As String
If openDatabase(dbname) Then
If openView(viewname) Then
Set doc = view.GetLastDocument
If doc Is Nothing Then
msg = “Cannot get last document ”
Else
Call getSubject
End If
End If
End If
getLastSubject = msg
End Function
Function getNthSubject(dbname As String, viewname As String, n As Integer) As String
If openDatabase(dbname) Then
If openView(viewname) Then
Set doc = view.GetNthDocument(n)
If doc Is Nothing Then
msg = “Cannot get document ” & n
Else
Call getSubject
End If
End If
End If
getNthSubject = msg
End Function
Private Function openDatabase(dbname As String) As Boolean
Set db = s.GetDatabase(“”, dbname)
If db.IsOpen Then
openDatabase = True
Else
openDatabase = False
msg = “Cannot open database ” & dbname
End If
End Function
Private Function openView(viewname As String) As Boolean
Set view = db.GetView(viewname)
If view Is Nothing Then
openView = False
msg = “Cannot open view ” & viewname
Else
openView = True
End If
End Function
Private Sub getSubject
If doc.HasItem(“Subject”) Then
msg = doc.GetItemValue(“Subject”)(0)
Else
msg = “Document does not have Subject”
End If
End Sub
End Class

А ось приклад на Java:






import lotus.domino.*;
import lotus.domino.types.*;
public class GetSubject {
Session s;
Database db;
View view;
Document doc;
String msg;
public GetSubject() {
s = WebServiceBase.getCurrentSession();
}
public String getFirstSubject(String dbname, String viewname) {
try {
if (openDatabase(dbname)) {
if (openView(viewname)) {
doc = view.getFirstDocument();
if (doc == null)
msg = “Cannot get first document “;
else
getSubject();
}
}
}
catch(Exception e) {
e.printStackTrace();
}
return msg;
}
public String getLastSubject(String dbname, String viewname) {
try {
if (openDatabase(dbname)) {
if (openView(viewname)) {
doc = view.getLastDocument();
if (doc == null)
msg = “Cannot get last document “;
else
getSubject();
}
}
}
catch(Exception e) {
e.printStackTrace();
}
return msg;
}
public String getNthSubject(String dbname, String viewname, int n) {
try {
if (openDatabase(dbname)) {
if (openView(viewname)) {
doc = view.getNthDocument(n);
if (doc == null)
msg = “Cannot get document ” + n;
else
getSubject();
}
}
}
catch(Exception e) {
e.printStackTrace();
}
return msg;
}
private boolean openDatabase(String dbname) {
boolean b = false;
try {
db = s.getDatabase(null, dbname);
if (db.isOpen())
b = true;
else
msg = “Cannot open database ” + dbname;
}
catch(Exception e) {
e.printStackTrace();
}
return b;
}
private boolean openView(String viewname) {
boolean b = false;
try {
view = db.getView(viewname);
if (view != null)
b = true;
else
msg = “Cannot open view ” + viewname;
}
catch(Exception e) {
e.printStackTrace();
}
return b;
}
private void getSubject() {
try {
if (doc.hasItem(“Subject”))
msg = doc.getItemValueString(“Subject”);
else
msg = “Document does not have Subject”;
}
catch(Exception e) {
e.printStackTrace();
}
}
}

Висновок


Lotus Notes / Domino 7 – інструмент для постачальника Web-служб, що дозволяє працювати з ними через елементи управління, аналогічні агентних. Web-служба повинна знаходитися на сервері Domino 7 з відкритим HTTP-доступом, за винятком того, що перевірити працездатність і провести налагодження Web-служби можна через попереднє інтернет-перегляд у клієнті Notes. Користувачі використовують Web-служби Domino через SOAP-кодовані запити HTTP POST.


Операції Web-служб перетворюються в публічні методи Java і публічні функції й підпрограми LotusScript. Елементи даних Web-служб перетворюються на параметри і повертаються значення. Коли це можливо, типи даних XSD перетворюються в прості типи даних Java і LotusScript. Елементи складних типів перетворюються в об’єкти.


У статті описано Lotus Notes / Domino 7 версії Beta 2. В процесі подальшої розробки можуть бути внесені деякі вдосконалення. Наприклад, в наступній версії очікується підтримка розміщення коду Web-служб в бібліотеках скриптів.


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*