Web-служби Lotus Notes / Domino 7

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.

Рис. 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-служби двічі клацніть по ній.

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


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

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


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


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


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


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


Вікно редактора таке ж, як і в агентів. Праворуч меню, що випадає, в якому можна вибрати LotusScript або Java. На малюнку нижче обрана 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-службі з прикладу.

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


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


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


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


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

Рис. 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-служб.

Рис. 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>

*

*