Python Web サービス開発者: 第 3 回: Web サービス ソフトウェア・リポジトリー 第 2 回

コンテンツ更新のための Web サービス

Uche Ogbuji と Mike Olson は、ソフトウェアの保管と管理のための Web サービスのいくつかの例を示しながら、SOAP メッセージを使用してリポジトリーを更新する方法と、それを Web サービスとして世に出す方法を示します。

Mike OlsonFourthought, Inc.

Mike Olson 氏は、企業向けの知識管理アプリケーションのための XML ソリューションを専門とするソフトウェア・ベンダーおよびコンサルタント会社である、Fourthought Inc. のコンサルタントであり、共同設立者です。Fourthoughtは、XML ミドルウェア用のオープン・ソース・プラットフォームである 4Suite を開発しています。



Uche Ogbuji, Consultant, Fourthought, Inc.

Uche photoUche Ogbuji 氏は、Fourthought, Inc. のコンサルタント兼共同設立者です。この会社は、企業のナレッジ・マネジメントのための XML ソリューションを専門とするソフトウェア・ベンダー兼コンサルタント会社です。Fourthought では、XML、RDF、およびナレッジ・マネジメント・アプリケーション用のオープン・ソース・プラットフォームである 4Suite を開発しています。Ogbuji 氏は、ナイジェリア出身のコンピューター・エンジニア兼ライターで、現在は、米国コロラド州ボールダーに住み、そこで働いています。



2001年 4月

このコラムの第 2 回で、ソフトウェア・リポジトリーの例を示し、データおよびメタデータ管理のために生じる多くの困難な作業が、使用可能な Web ツールや XML、XSLT、RDF などのオープン Web 標準を使用することにより、はるかに単純になることを説明しました。ソフトウェア・リポジトリーのコアの構築は非常に単純でしたので、これを Web サービスで表現する方法を時間をかけて考えることができます。

この記事では、HTTP POST および SOAP を使用してソフトウェア・リポジトリーにコンテンツを追加する方法を見ていきます。また、その結果として出来上がる Web サービスの SD 記述、およびこれを公開するために 4Suite Server を利用する方法も検討します。読者は、第 2 回の作業と、HTML フォームおよび Hypertext Transport Protocol (HTTP) プロトコル (参考文献を参照) について、よく理解している必要があります。

POST によるソフトウェア

まず最初に、単純な HTTP POST を使用した更新について考える必要があります。これは、コントリビューターとソフトウェア・エージェントの両方にとって、(前者の場合はブラウザー・フォームを使用して) 更新を行うための手段となる可能性があります。

最初に、ソフトウェア・リポジトリーのコアが、第 2 回で説明したステップに基づきセットアップされていることを確認してください。残念ながら、予定の変更が生じてしまいました。前回の記事は 4Suite Server バージョン 0.10.2 に基づいて書かれていますが、私たちはその後、大幅に機能が拡張されたバージョン 0.11.0 をリリースしました。0.11.0 のリリースに関連して前回の記事に対して行われた更新については、参考文献をご覧ください。

コントリビューターがリポジトリーに項目を追加するために、図 1 に示すフォームを使用するものとします。これはリスト 1 に示す HTML に対応したものです。

図 1: 新規ソフトウェアをリポジトリーに追加するためのフォーム
図 1: 新規ソフトウェアをリポジトリーに追加するためのフォーム

4Suite Server を使用すると、XSL 変換をセットアップし、このフォームで生成されるような POST 要求を処理して、XML リポジトリーに追加される新規文書を作成することができます。ソフトウェア・リポジトリーに項目を追加するために使用する XSL 変換は、リスト 2 に示すとおりです。

私たちの HTML ソースのフォーム・エレメントの action 属性は、URI 内のパスで文書とともにソースとして解釈され、template-xslt 引数は XSL 変換として解釈されて、新規文書の生成に使用されるようになります。

リスト 2: HTTP POST データを新規 XML 文書に変えるための XSLT 変換
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ftext="http://xmlns.4suite.org/ext"
extension-element-prefixes="ftext"
version="1.0"
>
<xsl:param name='title'/>
<xsl:param name='creator'/>
<xsl:param name='home'/>
<xsl:param name='version'/>
<xsl:param name='description'/>
<xsl:template match="/">
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1"
xmlns="http://namespaces.4suite.org/www/software-map"
>
<Software rdf:ID="{$title}">
<dc:Title><xsl:value-of select='$title'/></dc:Title>
<dc:Creator><xsl:value-of select='$creator'/></dc:Creator>
<dc:Description><xsl:value-of select='$description'/></dc:Description>
<CurrentVersion><xsl:value-of select='$version'/></CurrentVersion>
<Home rdf:resource="{$home}"/>
</Software>
</rdf:RDF>
<ftext:set-post-template-params
new-doc-uri="incoming/{$title}-{$version}.xml"
response-uri="thanks.xhtml"
docdef="dublin_core"
/>
</xsl:template>
</xsl:stylesheet>

最初に注意する必要があるのは、titlecreator などのパラメーターのグループです。これらは、同じ名前のフォーム・エレメントから得られる値に合わせて、サーバーによって自動的に設定され、HTTP POST 照会引数になります。その後でこれらのパラメーターを使用して、XSLT で用意されたすべてのツールを自由に使用して出力を作成することができます。読者もご承知のように、この変換は、このシリーズの第 1 回で紹介したフォームで、ソフトウェア記述文書を作成しようとするものです。話を単純にするために、いくつかのオプション・フィールドは省略することにします。

最後に、変換の最後の ftext:set-post-template-params 拡張エレメントに注目してください。これはサーバーによってセットアップされた特別な拡張であり、追加される文書の URI、その文書定義、および HTTP POST に対応して送信される HTML (これは、たとえば、何らかの項目を送るために「サブミット」ボタンをクリックした後でブラウザーに表示される HTML などです) を生成するためにサーバーが使用する URI などの、重要なパラメーターを設定するために使用できます。

関連するステップの概略は以下のとおりです。

  1. コンテナーを作成し、そのコンテナーに誰でも読み取りアクセスできるようにする。
  2. HTTP POST 操作のための文書を作成する。
  3. XSLT テンプレートを作成する。
  4. サブミット応答文書を作成する。
  5. 出力を保管するコンテナーを作成する。

これを試すために、最初に該当のコンテナーを作成し、誰でもそのコンテナーに読み取りアクセスできるようにしてください。

リスト 3a
$ 4ss create container /softrepo
$ 4ss set acl --world-read /softrepo

その後で、HTTP POST のターゲットとして単純なダミー文書 (単なる "<null/>") を作成してください。たとえば、次のようにします。

リスト 3b
$ 4ss create document - BASE_XML /softrepo/submit-new-software-entry
<null/>
$ 4ss set acl --world-read /softrepo/submit-new-software-entry

XML 文書のソースとして "-" を指定すると、コマンドは標準入力から XML ソースを読み取ります。次に、下記のようにテンプレート XSLT 文書を作成してください。

リスト 3c
$ 4ss create document submit-entry.xslt BASE_XSLT /softrepo/submit-entry.xslt
$ 4ss set acl --world-read softrepo/submit-entry.xslt

その後で、のようにサブミット応答文書を作成してください。

リスト 3d
$ 4ss create document - BASE_XML softrepo/thanks.xhtml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">
<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<title>Thanks for your submission</title>
</head>
<body>
<p>Thanks for your submission to the software repository.</p>
</body>
$ 4ss set acl --world-read softrepo/thanks.xhtml

最後に、サブミットされたソフトウェア・レコードの宛先となるコンテナーを作成します。匿名ユーザーが文書を追加できるようにするには、このコンテナーに誰でも書き込みができるようにする必要があります。リスト 3e を参照してください。

リスト 3e
$ 4ss create container softrepo/incoming
$ 4ss set acl --world-write softrepo/incoming

これがセットアップされると、人々がデータをフォームに入力したり、ソフトウェア・エージェントが任意の言語の HTTP ライブラリーを使用してデータを入力したりできるようになります。ただし、人手を介さずにソフトウェア同士でデータにアクセスする代替方式の人気が高まりつつあります。


ひとつながりのソフトウェア

4Suite Server は基本 SOAP API をインプリメントしています。この API をソフトウェア・リポジトリー Web サービスの基礎として使用することができます。

リスト 4 は、ダイレクト SOAP API を使用してソフトウェア項目ファイルを追加する、単純な Python コマンド行プログラムです。ダイレクト 4Suite Server API で使用される特殊なエンコード・スタイル http://4suite.org/4ss/direct に注意してください。このエンコード方式は、基本的には、メソッド呼び出しを表すエレメントとパラメーターを表す属性からなり、場合により、パラメーターとして使用される、文書を含む本体も含まれます。それを除くと、リスト 4 は非常に簡単なコードで、コマンド行パラメーターからの SOAP 要求文書を表す XML を構成し、それを HTTP 要求に組み込んで送り出し、応答を listen します。

リスト 4: コア API に従って SOAP 要求を送信する Python プログラム
import sys, string, httplib, base64, mimetools
SERVER_ADDR = '127.0.0.1'
SERVER_PORT = 8080
BODY_TEMPLATE = """<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ft="http://xmlns.4suite.org/services"
SOAP-ENV:encodingStyle="http://4suite.org/4ss/direct"
>
<SOAP-ENV:Body>
<ft:Create doc-def-name="%s" uri="%s">
%s
</ft:Create>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>"""

#define the function
def AddSoftwareFromFile(entry, docdef, uri):
body = BODY_TEMPLATE%(docdef, uri, base64.encodestring(entry))
blen = len(body)
requestor = httplib.HTTP(SERVER_ADDR, SERVER_PORT)
requestor.putrequest('POST', '/soap-handler')
requestor.putheader('Host', SERVER_ADDR)
requestor.putheader('Content-Type', 'text/plain; charset="iso-8859-1"')
requestor.putheader('Content-Length', str(blen))
requestor.putheader('SOAPAction', "")
requestor.endheaders()
requestor.send(body)
(status_code, message, reply_headers) = requestor.getreply()
reply_body = requestor.getfile().read()
print status_code
print message
print reply_body

if __name__ == "__main__":
fname = sys.argv[1]
docdef = sys.argv[2]
uri = sys.argv[3]
entry = open(fname, 'r').read()
AddSoftwareFromFile(entry, docdef, uri)

このプログラムを実行するサンプル・セッションをリスト 4b に示してあります。

これを見てお分かりのように、このサーバーは、リポジトリーに追加された文書をエコー・バックしているだけです。

しかし、上の HTTP POST の例のように、私たちに関する若干の関連情報をサーバーに渡して、単にソフトウェア・リポジトリー項目を構成させたい場合には、どうしたらよいのでしょうか?4Suite Server では、リスト 5 の例に示すように、ユーザー独自の特別な SOAP ハンドラーを書くことができます。この例は、ソフトウェアを記述するさまざまなフィールドからなる SOAP メッセージを処理し、サーバー・サイドで記述ファイルを作成し、それをリポジトリーに追加しています。

このモジュールの最も重要な部分は、4Suite Server SoapHandler からサブクラス化された SoftRepoSoapHandler クラスです。カスタマイズされたすべてのクラスでは、NS_TO_HANDLER_MAPPING というマッピングを定義する必要があります。これにより、それぞれのネーム・スペースごとに、SOAP 本体エレメント名からハンドラー関数へのマッピングが定義されます。私たちの例では、私たちが意図する要求を処理するために AddEntry 関数を用意しました。

このハンドラー・モジュールを使用するためには、それを 4Suite Server に登録しなければなりません。これは、Python ファイルを PYTHONPATH 上のどこかにコピーし、次のようなスタンザを構成ファイルに追加することによって行われます。リスト 6a を参照してください。

リスト 6a
<rdf:Description ID='SoftRepoSoapHandler'>
<rdf:type resource='http://xmlns.4Suite.org/4ss/properties#HttpHandler'/>    
<Priority>30</Priority>
<Module>SoftRepoSoapHandler</Module>
</rdf:Description>

また、私たちがセットアップした新規ハンドラーに関するを PythonServer または ApacheServer 構成スタンザに追加する必要もあります。

リスト 6b
 <Handler resource='#SoftRepoSoapHandler'/>

このハンドラーがセットアップされると、より簡単な SOAP 呼び出しによってソフトウェア・リポジトリーに項目を追加できるようになります。リスト 7 は、このためのクライアント・コードの例です。

リスト 7: ソフトウェア・リポジトリーへのクライアントの例
import sys, httplib
SERVER_ADDR = '127.0.0.1'
SERVER_PORT = 8080
BODY_TEMPLATE = """<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:s="http://spam.com/softrepo"
SOAP-ENV:encodingStyle="http://spam.com/softrepo/encoding"
>
<SOAP-ENV:Body>
<s:Add>
<s:Title><![CDATA[%s</s:Title>
<s:Creator><![CDATA[%s</s:Creator>
<s:Home><![CDATA[%s</s:Home>
<s:Version><![CDATA[%s</s:Version>
<s:Description><![CDATA[%s</s:Description>
</s:Add>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>"""

#define the function
def AddEntry(title, version):
creator = raw_input("Creator: ")
home = raw_input("Home: ")
desc = raw_input("Description: ")
body = BODY_TEMPLATE%(title, creator, home, version, desc)
blen = len(body)
requestor = httplib.HTTP(SERVER_ADDR, SERVER_PORT)
requestor.putrequest('POST', '/softrepo/soap-handler')
requestor.putheader('Host', SERVER_ADDR)
requestor.putheader('Content-Type', 'text/plain; charset="iso-8859-1"')
requestor.putheader('Content-Length', str(blen))
requestor.putheader('SOAPAction', "")
requestor.endheaders()
requestor.send(body)
(status_code, message, reply_headers) = requestor.getreply()
reply_body = requestor.getfile().read()
print status_code
print message
print reply_body

if __name__ == "__main__":
title = sys.argv[1]
version = sys.argv[2]
AddEntry(title, version)

リスト 7add_software2.py という名前で保管し、リスト 7b に示すように試してみてください。


今後の作業

SOAP サポートを使用すると、私たちのソフトウェア・リポジトリーを、急速に発展しつつある Web サービス インフラストラクチャーと統合することができ、基本 HTTP POST サポートを使用すると、人手による作業や従来からの HTTP ベースの自動化が行えます。すでに示したように、これら両方のインターフェースを同じアプリケーションに組み込むことは、Python ベースのサービスを使用してかなり簡単に行うことができます。次回の記事では、私たちのソフトウェア・リポジトリーを Web Service として提供するための技法を仕上げる予定です。

参考文献

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=SOA and web services
ArticleID=241876
ArticleTitle=Python Web サービス開発者: 第 3 回: Web サービス ソフトウェア・リポジトリー 第 2 回
publish-date=042001