本文へジャンプ

ソフトウェア > Lotus > Lotus Developer Domain > 製品別技術情報 > Lotus Notes/Domino関連製品 > 

LDD Today

QucikPlaceのMy Placeに接続するWeb Serviceの作成


Lotus Software
by ラージ・バラスブラマニアン
レベル:上級者
対象: QuickPlace
原文の掲載:2003年6月2日

LDD Todayの原文(US)

インデックス
WebServiceの概要
1つにまとめる
MyPlaceWebServiceを作成する
MyPlaceWebServiceの動作
まとめ

Web Serviceは、Webを介して配置し、実行できるAPIのセットです。Web Serviceは、複雑なアプリケーション機能にアクセスする共通インターフェースを提供し、それによって企業内および企業間の分散した異種システムの統合を約束します。Web Serviceテクノロジーは、IBMやMicrosoftをはじめとする大手ソフトウェア・ベンダー数社によってサポートされており、Web開発コミュニティー内でも関心が高まっています。Web Serviceの詳細については、developerWorks Web Serviceゾーンをご覧ください。

QuickPlaceなどのLotus Webアプリケーションをはじめとする既存のアプリケーションは、Web Serviceとして実行することができます。QuickPlace 3.0では、Web Serviceを利用可能にするものとして、次の2つの重要な新機能が導入されています。
  • My Place - 特定のユーザーが所属するPlaceのカスタム・リスト
  • Place Catalog - Placeおよびメンバーシップ情報の保存場所
これら2つの機能が相まって、複数のPlaceサーバーが含まれるQuickPlace環境への入口の一元化が実現されます。

この記事で説明する手法を使えば、My Place機能をWeb Serviceとして公開することができ、それによってPython、Java、COM(互換言語)、Perlをはじめとする各種プログラミング言語を用いて、Webクライアントで特定のユーザーのPlaceを検索することが可能になります。この記事では、まずWeb Serviceの仕組みと、Web Serviceを定義するためのXMLフォーマットであるWSDL(Web Service Description Language)の使い方を概説します。その後、My Place機能をWeb Serviceとして使用可能にするXMLコードとDominoエージェントの作成方法について説明します(この記事で紹介するコードはすべて、Sandboxからダウンロードできます)。なお、この記事の対象読者は経験のあるDominoおよびXMLプログラマーです。


Web Serviceの概要
従来の遠隔通信方法は、リモート・プロシージャー・コール(RPC)テクノロジーをベースにしたものが最も一般的でした。よく知られている例をいくつか挙げると、NRPC(Notes RPC)、IIOP(Internet Inter-ORB Protocol)、RMI(リモート・メソッド呼び出し)、DCOM(分散コンポーネント・オブジェクト・モデル)などがあります。これらはすべて、トランスポートするデータの記述に固有のフォーマットと言語を使用します。また、固有のセキュリティー・パラダイムによりIDの確立と確認を行います。したがって、クライアントでこれらのプロトコルをサポートするには、それぞれ固有のライブラリーを個別に展開する必要があります。これは、複雑なマルチアプリケーション環境では煩雑な作業となる可能性があります。

Web Serviceは、本質的に異なるRPCモデルを、さまざまなシステムが理解でき、既存のWebテクノロジーを利用してサポートできる共通の言語にまとめる方法を提供します。それによって、J2EEでコーディングされたサービスを、Windowsマシン上のVisual BasicクライアントやLinuxマシン上で実行されたPHPページからアクセスして呼び出すことが可能になります。これを実現するために、Web Serviceテクノロジーにはカプセル化、メッセージ・パッシング、動的バインディング、サービス記述、照会などのテクノロジーが含まれています。

Web Serviceテクノロジーには、大きく分けて3つの構成要素があります。
  • 保管および検索
    標準は、UDDI(Universal Description, Discovery, and Integration)です。この記事では、Web Serviceの保管および検索については取り上げません。詳細については、UDDI Webサイトをご覧ください。
  • 記述
    標準は、WSDL(Web Service Description Language)です。
  • インプリメンテーション/通信
    標準は、SOAP(Simple Object Access Protocol)です。
    すべての構成要素で使用される共通言語はXMLです。次のセクションでは、WSDLとSOAPについてさらに詳しく説明します。
WSDL
WSDLは、Web Serviceをメッセージ交換が可能な通信エンドポイントの集合として記述するためのXMLフォーマットです。WSDL定義は、分散システムに関する情報を提供し、アプリケーション間通信に必要な詳細を自動化するのに役立ちます。
WSDLは、エンドポイントとそのメッセージを、通信に使用されるメッセージ・フォーマットやネットワーク・プロトコルのタイプによらず記述できるように拡張することが可能です。WSDL文書では、以下の要素を用いてWeb Serviceを定義します。
  • types:XSD(XMLスキーマ定義言語)などの型体系によるデータ型定義のためのコンテナー
  • message:通信データ(要求および応答)の抽象型定義
  • operation:サービスがサポートするアクションの抽象記述
  • portType:1つ以上のエンドポイントがサポートする操作の抽象的集合
  • binding:特定のportType要素の具体的なプロトコルとデータ・フォーマットの指定
  • port:バインディングとネットワーク・アドレスの組み合わせとして定義される単一のエンドポイント
  • service:関連するエンドポイントの集合
WSDLの詳細については、Web Services Description Language specification をご覧ください。

SOAP
SOAP(Simple Object Access Protocol)は、分散環境において情報を交換するためのプロトコルです。SOAPプロトコルは、メッセージの内容とその処理方法を記述するためのエンベロープ、アプリケーション定義のデータ型のインスタンスを表現するためのエンコード規則、およびリモート・プロシージャー・コールと応答を表現するための標準からなります。SOAPはトランスポート・メカニズムとしてHTTPを使用できるため(その他にもSMTP、Jabber、BEEPが使用可能)、企業が設置しているファイアウォール越しでもシームレスに機能することができます。SOAPの詳細については、SOAP specificationをご覧ください。
 
上に戻る
 
1つにまとめる
アプリケーションをWeb Serviceとして使用可能にするための最初のステップは、SOAP対応クライアントがアクセスできるアプリケーションのインプリメンテーションを実現することです。そうすれば、このアプリケーションのインプリメンテーションをWeb Serviceの最も単純な形と考えることができます。クライアントがSOAP要求メッセージを送信すると、Web Serviceはその要求を処理し、SOAP応答を返信します。これをうまく機能させるには、クライアントはWeb Serviceインプリメンテーションのアドレスだけでなく、そのメッセージで渡せるパラメーターも知っていなければなりません。クライアントは、適切なインプリメンテーションを呼び出し、適切なパラメーターを使用できるようにするために、Web Serviceに対してWSDLを要求します(利用可能な場合)。WSDLによって、要求パラメーター、応答パラメーター、およびWeb Serviceインプリメンテーションのアドレスが記述されます。この情報によって、クライアントは適切なパラメーターを用いて正しいアドレスにSOAP要求を送信することができます。

さらに発展させて、新たに作成したこのWeb Serviceとクライアントによるこのサービスの照会をUDDIディレクトリーに公開できます。これは、いわばWeb Serviceの「イエロー・ページ」です。公開したサービスは、分類したり企業と関連付けたりすることができ、さらにサービスを記述するメタデータを付けることもできます。その結果、クライアントは目的のWeb Serviceを検索し、見つかったらWSDLのリンクを使ってそのWeb Serviceを使用できるようになります。

 
上に戻る
 
My Place Web Serviceを作成する
このセクションでは、My Place(特定のユーザーが所属するすべてのQuickPlaceのリスト)を配信し、そのWeb Serviceを表すWSDLを作成するWeb Serviceを開発します。その後、SOAP対応WebクライアントにこのWeb Serviceを利用可能にするには、このWSDLをUDDIディレクトリーに公開する必要があります(この記事では、UDDIディレクトリーへのWSDLの公開は扱いません。詳細については、UDDIホーム・ページをご覧ください)。
My Place Web Serviceは、次のようないくつかのテクノロジーを用いて作成することができます。
  • Java
    Web Serviceを作成し、ApacheまたはWebSphereサーバーでホスティングします。その後、SOAPメッセージを処理するサーブレットをコーディングし、QuickPlaceサーバーでホスティングします。
  • .Net
    この場合、Web Serviceを開発し、.Net上でホスティングします。
  • LotusScriptエージェント
    LotusScriptを用いてWeb Serviceをインプリメントする場合、Microsoft SOAP Toolkit(COMベース)を用いてエージェントを作成する、SOAPメッセージを処理するパーサーを作成する、またはSOAP LSXを開発し、それをエージェント内部で使用するという3つの方法があります。最初の方法がおそらく最も簡単な方法であるため、この記事ではこの方法をとります。ただし、この方法ではMicrosoft SOAP Toolkit 3.0が必要です(ここからダウンロードできます(US))。

LotusScriptエージェントは、次のようにクライアントのSOAP要求を処理します。

  1. クライアントが、要求するMy Placeと関連付けられたユーザー名を含むHTTP SOAP要求を送信します。要求のターゲットはエージェントのURLです。
  2. エージェントは、MS SoapReader30オブジェクトを初期化した後、要求からSOAPメッセージを読み込み、ユーザー名を抽出します。
  3. LotusScriptデータベース関数呼び出しによりPlace Catalogデータベースを開き、ユーザー名を照会します。ユーザー名が存在する場合、文書のリスト(My Place)が返され、各文書からPlace NameとPlace Server Nameが抽出されます。
  4. Printステートメントにより、返された照会結果からSOAPメッセージが構築されます。このメッセージがHTTP SOAP応答としてクライアントに送信されます。
  5. このSOAP応答を受け取ったクライアントが、メッセージ内のデータを構文解析し、表示します。
myplaceserviceエージェント
My Place Web Serviceは、Place Catalogサーバー上にあるDominoデータベースにDominoエージェントとして配置されます。この例では、エージェント名を「myplaceservice」、Dominoデータベース名を「MyPlaces.nsf」としています。このエージェントは、一度だけ実行するエージェントです。

myplaceserviceエージェント
My Place Web Serviceは、Place Catalogサーバー上にあるDominoデータベースにDominoエージェントとして配置されます。この例では、エージェント名を「myplaceservice」、Dominoデータベース名を「MyPlaces.nsf」としています。このエージェントは、一度だけ実行するエージェントです。
エージェントのコードは、大きく4つのセクションに分かれています。最初のセクションは、基本的な変数/オブジェクト宣言からなります。

Sub Initialize
Dim s As New notessession
Dim db As notesdatabase
Dim curdb As notesdatabase
Dim pdoc As notesdocument
Dim coll As notesdocumentcollection
Dim v As notesview
Dim doc As notesdocument
Dim soap As Variant
Dim SOAPin As String

標準のNotesオブジェクト宣言に加えて、SOAPReaderオブジェクトのホルダー(soapバリアントで)と、読み込む内容を保持するストリング変数も定義しています。
コードの2番目のセクションでは、MSSoapReaderオブジェクトを用いて着信SOAP要求を読み込みます。

Set soap = CreateObject("MSSOAP.SoapReader30")

Set doc = s.documentcontext
SOAPin = doc.GetItemValue("Request_content")(0)

soap.LoadXML SOAPin
scs$ = soap.RPCParameter("dn").text
MethodName = soap.RPCStruct.baseName
NameSpace ="Domino"

次に、SOAPReaderオブジェクトを作成し、現在のWeb文書を読み込み、要求内容を抽出することによってバリアント(soap)を初期化します。これを、前のセクションで宣言したSOAPinストリングに割り当てます。次いで、SOAPReaderオブジェクトのLoadXMLメソッドを用いて、要求内容をバリアントに読み込みます。これにより、SOAPReaderのRPCParameterプロパティーを用いて、取り出すべき属性(この場合は「dn」)を指定できるようになります。その後、属性のテキスト値を抽出します。抽出が完了すると、SOAPReaderのRPCStruct.baseNameプロパティーを用いて、クライアントが呼び出したメソッドを抽出することができます。そのメソッドが正しい場合、Place Catalogにユーザーがメンバーシップを有するPlaceのリストを照会します。My Placeリストは、セミコロンで区切られた、PlaceのURLのストリングとして返されます。要求元のSOAPクライアントが正しいメソッドを呼び出さなかった場合は、返されたストリングを修正します。その場合、SOAP Faultを追加します。

If MethodName = "GetMyQPs" Then
Set curdb=s.currentdatabase
Set db=s.getdatabase(curdb.server,"PlaceCatalog.nsf")
Set v = db.getview("PlacesByMember")
Set coll=v.getalldocumentsbykey(scs$)
Set pdoc = coll.getfirstdocument
ch$ = ""
While Not pdoc Is Nothing
If Len(ch$) < 1 Then
ch$="http://"+pdoc.PlaceServerName(0)+"/"+pdoc.PlaceName(0)
Else
ch$=ch$+";"+"http://"+pdoc.PlaceServerName(0)+"/"+pdoc.PlaceName(0)
End If
Set pdoc=coll.getnextdocument(pdoc)
Wend
response=ch$
rr$ = |<m:| & MethodName & "Response" & | xmlns:m="| & NameSpace & |
" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> | & _
|<Answer xsi:type="xsd:string">| & response & |</Answer>| & _
|</m:| & MethodName & |Response>|

Else
response = "Invalid Method Name used"
rr$ = |<SOAP-ENV:FAULT><faultcode>Client.Authentication</faultcode> <faultstring>Invalid Methd Name</faultstring> <faultactor>http://localhost/</faultactor> <detail xsi:type="xsd:string"/>
</SOAP-ENV:Fault> |
End If

これが完了したら、応答ストリングを構築します。

Print "Content-Type: text/xml"
strTmp = |<?xml version="1.0" encoding="UTF-8" standalone="no"?>| &_
|<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">| & _ || & _
rr$ & _
|</SOAP-ENV:Body>| & _
|</SOAP-ENV:Envelope>|

Print strTmp
End
 
上に戻る
 
My Place Web Serviceの動作
My Place Web Serviceを作成すると、SOAP対応クライアントは次のようにして要求を送信することができます。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<dn>cn=admin,o=ibmtest</dn>
</m:GetMyQPs>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

メッセージはXMLフォーマットであり、渡される主要な情報はユーザー名です。これは、上記コード中の<dn>属性で囲まれた行(ボールド体で示されている行)に表示されます。myplaceserviceエージェントWeb Serviceによって要求が処理され、SOAP応答がクライアントに返信されます。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelopexmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> http://localhost/myqp1,http://localhost/testqp2

</m:GetMyQPsResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

応答もまたXMLフォーマットです。処理のためにクライアントに渡される主要情報は、上記コード中の<Answer>属性で囲まれたボールド体の行に表示されます。
 
上に戻る
 
まとめ

いかがですか。お役に立ちましたでしょうか。My Placeに接続するWeb Serviceを作成すれば、QuickPlaceの能力が一段と高まり、その機能をより幅広くWebユーザーに提供できるようになります。また、このプロセスはWeb Serviceの基本概念を理解する上で助けとなるはずで、さらに他のアプリケーション用のWeb Serviceの作成に応用することも可能です。



著者について
ラージ・バラスブラマニアンは、IBM Software Services for LotusのコンサルティングITアーキテクトです。彼は、お客様のアプリケーションおよびインフラストラクチャー関連プロジェクトの契約に従事しています。彼の趣味は、技術全般から歴史学や物理学に至るまで多岐にわたっており、貴重な余暇は息子たちとロボット談義に花を咲かせています。
 
上に戻る