IBM Lotus Quickr Representational State Transfer (REST) サービスを使用して、基本的な操作を文書に対して実行する方法を理解しましょう。

Ramajeyam Gopalraj (ramajeyam_gopalraj@us.ibm.com), Advisory Software Engineer, IBM

Ramajeyam Gopalraj is an Advisory Software Engineer at IBM working with the Lotus Quickr team in Research Triangle Park, NC. You can reach Ramajeyam at ramajeyam_gopalraj@us.ibm.com.



Derek Carr (dwcarr@us.ibm.com), Advisory Software Engineer, IBM

Derek Carr is an Advisory Software Engineer at IBM working with the Lotus Quickr team in Research Triangle Park, NC. You can reach Derek at dwcarr@us.ibm.com.



Gregory Melahn, Architect and Senior Technical Staff Member, IBM

Greg Melahn is an Architect and Senior Technical Staff Member in the Workplace, Portal, and Collaboration portfolio of IBM software. You can reach Greg at melahn@us.ibm.com.



2007年 10月 09日

前提条件

この記事を最大限活用するには、Java および Web 2.0 プログラミングを十分に理解している必要があります。また、サンプル・コードを使用するには、Eclipse フレームワークおよび Apache Abdera クライアント・ツールキットの基本的な理解が必要です。Apache Abdera クライアント・キットの詳細については、developerWorks の記事 「Getting to know the Atom Publishing Protocol, Part 3: Introducing the Apache Abdera project(US)」 を参照してください。


概要

Quickr REST サービスの目的は、開発者が可能な限り少ない労力でコラボレーティブ・ソリューションを構築できるようにすることです。このサービスは、オープン・スタンダードおよび Web 2.0 テクノロジーに基づいて設計されており、HTTP や XML といった既存の Web テクノロジーを基本的に理解した上で、アプリケーションの構築を可能にします。特に、コンテンツを扱うときは REST スタイルの URL を使用します。サービスは、RFC 4287 に記載されている Atom シンジケーション・フォーマットに基づいて Lotus Quickr からのコンテンツにアクセスし、新しい Atom パブリッシング・プロトコル (APP) に基づいてコンテンツを Lotus Quickr にパブリッシュします。

APP では、文書ライブラリーは APP コレクションとして扱われ、文書は APP リソースとして扱われます。クライアントが、APP によって定義された URL に対し、適切な HTTP メソッド (GET、POST、PUT および DELETE など) を呼び出せるようにするために、URL は各コレクションおよびリソースごとに定義されます。また、URL は予測可能なパターンにしたがうため、クライアントはサーバーに URL の提供を要求することなく、そのURLを作成できます。サービスの詳細については、「IBM Lotus Quickr Developer's Guide(US)」 を参照してください。


Quickr Connector について

あなたは、Lotus Quickr がデプロイされている Acme Corporation のアプリケーション開発者であると仮定しましょう。Acme のアーキテクトおよび設計者は Lotus Quickr を使用して、アーキテクチャーおよび設計文書を Lotus Quickr プレースに保存しています。開発者はたびたび文書を参照する必要があるので、あなたのような機転の利く開発者は、Eclipse 開発プラットフォームでこれらの文書にすぐにアクセスでき、社内全体で幅広く使用されれば、生産性が高まるだろうと考えました。そこで、貴女は Quickr Connector を開発することを決定します。これは、既存のアプリケーションまたはフレームワークへの拡張であり、必要な時に必要な場所からコンテンツへのアクセスを可能にします。たとえば、Lotus Quickr 文書へのリンクをメール・メッセージに埋め込むことができる Quickr Connector for IBM Lotus Notes があります。

この記事の例では、文書ライブラリーへのアクセスを可能にする Eclipse ビュー・プラグインとして Quickr Connector をインプリメントします。このプラグインの名前は QuickrNavigator で、ツリー・コントロールがある Eclipse ビューを持っています。Lotus Quickr サーバーから文書ライブラリーを表示するようビューを構成できます。ツリー・コントロールは、ライブラリーを最上位のノードとして表示し、ライブラリーの各フォルダーを拡張可能なノードとして、文書をリーフ・ノードとして表示します。プラグインの最初の反復により、次の操作が実装されます。

  • ライブラリーまたはライブラリー内のフォルダーにローカル・ファイルをアップロードする
  • フォルダーまたはライブラリーを更新し、最新のコンテンツをリストする
  • ローカル・ファイル・システムに文書をダウンロードする
  • ダブルクリックにより、関連するアプリケーションで文書を表示する
  • 文書を削除する

この記事の例では、オープン・ソースの Apache Abdera クライアントを使用して、Atom フィードを解析し、サーバーへの HTTP 要求を作成しています。


ライブラリーのリストの取得

まず、ナビゲーション・ツリーで第 1 レベルのノードを構築するために、ライブラリーのリストを取得する必要があります。文書ライブラリーは、Atom 用語ではコレクションとして表されていることを思い出してください。Atom は、コレクションを取得するメカニズムとしてサービス文書を定義します。このサービス文書を取得するには、サーバー名およびそのサーバーに接続するためのユーザー ID とパスワードを知らなければなりません。使用する URL はイントロスペクション URLであり、URL 形式はドキュメントで公開されているため、特定のサーバー用の URL を自分自身で構築できます。このサーバーでは、URL は次のようになります。

http://quickr.acme.com/dm/atom/introspection

ライブラリーのリストを取得するには、この URL への GET 要求を使用します。応答には、1 つの <workspace> 要素と各ライブラリーごとの <collection> 要素を持つ Atom サービス文書が含まれています (リスト 1 参照)。

リスト 1. Atom サービス文書
<service>
 <workspace title="Teamspace Documents">
  <collection title="Architecture Documents" href="http://quickr.acme.com/library/
  5d06ab0044ed8129bd5ebd4caeec5df1/feed">
	<accept>application/*,image/*,*/*</accept>
  </collection>
  <collection title="Design Documents" href="http://quickr.acme.com/library/
  3c06ab0044ed8129bd5ebd4cbeec5dc4/feed">
	<accept>application/*,image/*,*/*</accept>
  </collection>
 </workspace>
</service>

title 属性の値は、ツリー・ノードのラベルとして使用します。<collection> 要素の href 属性には、ノードでツリーが展開されたときにライブラリーの内容を取得するために後で使用する URL が含まれています。サンプルのこの応答を処理するコード部分をリスト 2 に示します。

リスト 2. 応答を処理するコード部分
try {
	httpClient.addCredentials(serverConfig.getUrl(), null, null, 
new UsernamePasswordCredentials(serverConfig.getUserId(), 
serverConfig.getPassword()));

	httpClient.usePreemptiveAuthentication(true);

	ClientResponse response = httpClient.get(serverConfig.getUrl()
							+ "/dm/atom/introspection");

	if (response.getStatus() == 200) {

		Document serviceDoc = response.getDocument();
		Element element = serviceDoc.getRoot().getFirstChild();
		while (element != null) {
			if (element instanceof Workspace) {
				Workspace ws = (Workspace) element;
				Iterator collections = ws.getCollections()
								.iterator();
				while (collections.hasNext()) {
					TreeParent collection = new TreeParent(
						(Collection) collections.next(),
						true);
						invisibleRoot.addChild(collection);
				}
			}
			element = element.getNextSibling();
		}
	}
} catch (Exception e) {
	e.printStackTrace();
	showMessage(e.toString());
}

Atom サービス文書を処理すると、プラグインはユーザーとやりとりする準備が整います (図 1 参照)。

図 1. サーバーから取得したライブラリーのリストを表示するプラグイン
図 1. サーバーから取得したライブラリーのリストを表示するプラグイン

フォルダーおよび文書のリストの取得

これまでにツリーの第 1 レベル・ノードが構築できたので、ライブラリー内の文書とフォルダーを表示しましょう。これを行うには、ライブラリーから内容を取得し、子ノード (フォルダーおよび文書) を構築する必要があります。フィード URL はライブラリー・ノードのそれぞれに保存したので、内容の取得は容易です。その URL に GET 要求を発行し、応答として Atom フィード文書を入手します (リスト 3 参照)。

http://quickr.acme.com/dm/atom/library/5d06ab0044ed8129bd5ebd4caeec5df1/feed

リスト 3. Atom フィード文書
<?xml version="1.0" encoding="UTF-8"?>
<feed xml:base="http://quickr.acme.com/dm/atom/library/
5d06ab0044ed8129bd5ebd4caeec5df1/" xmlns="http://www.w3.org/2005/Atom">
  <generator uri="http://quickr.acme.com/dm/atom" 
  version="1.0">Teamspace Documents</generator>
  <id>urn:lsid:ibm.com:td:5d06ab0044ed8129bd5ebd4caeec5df1</id>
  <link href="feed" rel="self"></link>
  <link href="http://quickr.acme.com/wps/mypoc?uri=
  dm:5d06ab0044ed8129bd5ebd4caeec5df1&verb=view" rel="alternate"></link>
  <link href="feed?pagesize=2&page=3" rel="next"></link>
  <link href="feed?pagesize=2&page=1" rel="previous"></link>
  <collection href="feed" xmlns="http://purl.org/atom/app#">
    <atom:title type="text" xmlns:atom="http://www.w3.org/2005/
    Atom">Architecture Documents</atom:title>
    <accept>application/*,image/*,*/*</accept>
  </collection>
  <author>
    <uri>uid=jsmith,o=acme</uri>
    <name>John Smith</name>
    <email>jsmith@acme.com</email>
  </author>
  <title type="text">Architecture Documents</title>
  <updated>2007-04-10T13:07:00.672Z</updated>

  <entry xml:lang="en">
    <id>urn:lsid:ibm.com:td:7f37550044f10d5b9144bbd6afe18010</id>
    <link href="document/7f37550044f10d5b9144bbd6afe18010/entry" rel="self"></link>
    <link href="http://quickr.acme.com/wps/mypoc?uri=
    dm:7f37550044f10d5b9144bbd6afe18010&verb=view" rel="alternate"></link>
    <link href="document/7f37550044f10d5b9144bbd6afe18010/entry" rel="edit"></link>
    <link href="document/7f37550044f10d5b9144bbd6afe18010/media" 
    rel="edit-media"></link>
    <link href="document/7f37550044f10d5b9144bbd6afe18010/media" 
    rel="enclosure" type="application/msword" title="Architecture Guidelines.doc" 
    hreflang="en" length="19968"></link>
    <category term="document" scheme="tag:ibm.com,2006:td/type" 
    label="document"></category>
    <author>
      <uri>uid=jsmith,o=acme</uri>
      <name>John Smith</name>
      <email>jsmith@acme.com</email>
    </author>
    <title type="text">Architecture Guidelines.doc</title>
    <published>2007-04-11T16:51:04.594Z</published>
    <updated>2007-04-11T16:51:04.594Z</updated>
    <td:created>2007-05-13T19:03:25.500Z</td:created>
    <td:modified>2007-05-13T19:03:25.500Z</td:modified>
    <td:modifier>
      <td:uri> uid=jdoe,o=acme </td:uri>
      <td:name>John Doe</td:name>
      <td:email>jdoe@acme.com </td:email>
    </td:modifier>
    <summary type="html"><span><img align="middle" 
    src="thumbnail/7f37550044f10d5b9144bbd6afe18010/
    media></span><span>&nbsp;&nbsp;</span><span>
    General guidelines for architecture </span></summary>
    <content type="application/msword" xml:lang="en" 
    src="document/7f37550044f10d5b9144bbd6afe18010/media"></content>
  </entry>

  <entry>
    <id>urn:lsid:ibm.com:td:5dc3f38044eee4ca90d8bad6afe18010</id>
    <link href="folder/5dc3f38044eee4ca90d8bad6afe18010/entry" rel="self"></link>
    <link href="http://quickr.acme.com/wps/mypoc?uri=
    dm:5dc3f38044eee4ca90d8bad6afe18010&verb=view" rel="alternate"></link>
    <link href="folder/5dc3f38044eee4ca90d8bad6afe18010/entry" rel="edit"></link>
    <category term="folder" scheme="tag:ibm.com,2006:td/type" 
    label="folder"></category>
    <author>
      <uri>uid=jsmith,o=acme</uri>
      <name>John Smith</name>
      <email>jsmith@acme.com</email>
    </author>
    <title type="text">Johns Folder</title>
    <published>2007-04-10T23:58:29.219Z</published>
    <updated>2007-04-10T23:58:29.219Z</updated>
    <td:created>2007-05-13T19:03:25.500Z</td:created>
    <td:modified>2007-05-13T19:03:25.500Z</td:modified>
    <td:modifier>
      <td:uri> uid=jdoe,o=acme </td:uri>
      <td:name>John Doe</td:name>
      <td:email>jdoe@quickr.acme.com </td:email>
    </td:modifier>
    <summary type="text">John's architecture documents</summary>
    <content type="application/atom+xml" 
    src="folder/5dc3f38044eee4ca90d8bad6afe18010/feed"></content>
  </entry>

</feed>

このフィードには、ライブラリー・ルート下の各フォルダーおよび文書ごとに 1 つの Atom エントリーが含まれています。<category> 要素は、エントリーがフォルダーまたは文書のどちらに対応しているのかを示します。フォルダーは、子フォルダーおよび文書を持つことができるので、展開可能なノードとしてツリー内に表示します。文書はリーフ・ノードとして表示されます。フィード文書からわかるように、各エントリーは自己リンクを通じて自分自身への URL を持っています。これは、Atom での役に立つもう 1 つのパターン、つまりリンク要素の使い方を示しています。リンクは、コンテンツ項目について関連するコンテンツ、ビュー、またはアクションのすぐに使える URL を提供します。これにより、アプリケーションはこれらの URL を作成する作業の一部から解放されます (ただし、前述のようにこれらの URL は予測可能です)。

フォルダー・エントリーについては、そのフォルダー用のフィード URL を後で作成するために、自己リンクを TreeParent インスタンスに保存します。ライブラリーのフィード URL を使用してライブラリー・コンテンツを保存および取得したのと同じように、このフィード URL を使用してコンテンツを保存および取得します。

文書エントリーについては、文書のコンテンツについて注目します。このため、文書エントリーの edit-media リンクをその TreeObject インスタンスに保存します。これらのリンクの関係については、「Atom Publishing Protocol の仕様書」(以下リンクあり) を参照してください。Atom エントリーを処理してツリー・ノードにするコード部分をリスト 4 に示します。
Atom Publishing Protocol の仕様書(US)

リスト 4. Atom エントリーを処理してツリー・ノードにするコード部分
ClientResponse response = httpClient.get(url);
if (response.getStatus() == 200) {
	Feed feed = (Feed) response.getDocument().getRoot();
	Iterator entries = feed.getEntries().iterator();
	while (entries.hasNext()) {
		boolean isFolder = false;
		Entry entry = (Entry) entries.next();
		try {
			Iterator categories = entry.getCategories(
				"tag:ibm.com,2006:td/type").iterator();
			while (categories.hasNext()) {
				Category cat = (Category) categories.next();
				if (cat.getTerm().equals("folder")) {
					isFolder = true;
					break;
				}
			}
		} catch (IRISyntaxException e) {
			e.printStackTrace();
		}
		if (isFolder) {
			TreeParent folder = new TreeParent(entry, false);
			addChild(folder);
		} else {
			TreeObject document = new TreeObject(entry);
			addChild(document);
		}
	}
}

ライブラリーの Atom フィード文書を処理した後、プラグインはライブラリーの内容を示します (図 2 参照)。

図 2. ライブラリーの内容を表示するプラグイン
図 2. ライブラリーの内容を表示するプラグイン

文書コンテンツの取得

文書のメディア・コンテンツは、ユーザーが読んだり、更新したい内容を表します。たとえば、メディア・コンテンツは PDF ファイルにすることができます。文書のリストがライブラリーに表示された後、ユーザーは個々の文書をダブルクリックすることにより、その文書のメディア・コンテンツを表示できます。ユーザーによって文書がダブルクリックされたときは、関連するアプリケーション (たとえば、PDF ファイルの場合は Adobe Reader) でその文書を起動する必要があります。まず、アプリケーションが何らかの作業ができるように、文書のメディア・コンテンツを入手しなければなりません。これを行うには、文書ノードの TreeObject インスタンスに保存した edit-media リンクを使用します。

http://quickr.acme.com/dm/atom/library/5d06ab0044ed8129bd5ebd4caeec5df1/document/
7f37550044f10d5b9144bbd6afe18010/media

この URL に GET 要求を発行すると、応答として文書のメディア・コンテンツが得られます。応答を読み取り、一時ファイルに保存し、関連するアプリケーションでその一時ファイルを起動します。この操作を行うコードをリスト 5 に示します。

リスト 5. 文書のダウンロードおよび起動を行うコード部分
public void doOpen(String url) {
TreeObject item = (TreeObject) ((IStructuredSelection) viewer
		.getSelection()).getFirstElement();
try {
String tmpDir = File.createTempFile("qkr",
"tmp").getParent();
File file = new File(tmpDir + "/" + item.getName());
if (file.exists()) {
	file.delete();
}
ClientResponse response = httpClient.get(url);
if (response.getStatus() == 200) {
	BufferedInputStream bis = new BufferedInputStream(
response.getInputStream());
	file.createNewFile();
	BufferedOutputStream bos = new BufferedOutputStream(
				new FileOutputStream(file));
	byte[] bytes = new byte[1024];
	int count = 0;
	while ((count = bis.read(bytes)) != -1) {
		bos.write(bytes, 0, count);
	}
	bis.close();
	bos.close();

	// open the local file in editor
	IWorkspace ws = ResourcesPlugin.getWorkspace();
	IProject project = ws.getRoot().getProject("Quickr
Files");
	if (!project.exists()) {
		project.create(null);
	}
	if (!project.isOpen()) {
		project.open(null);
	}
	IPath location = new Path(file.getPath());
	IFile iFile =
project.getFile(location.lastSegment());
	if (!iFile.exists()) {
		iFile.createLink(location, IResource.NONE, 

						null);
	}
	FileEditorInput fileEditorInput = new
FileEditorInput(iFile);
	IEditorRegistry registry = PlatformUI.getWorkbench()
				.getEditorRegistry();
	IWorkbenchPage page =
getViewSite().getWorkbenchWindow()
				.getActivePage();
	if (page != null) {				
if( registry.isSystemExternalEditorAvailable(
 			iFile.getName()))
{
			page.openEditor( fileEditorInput,	
			IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID);

		} else if
		 (registry.isSystemInPlaceEditorAvailable(iFile
					.getName())) {

				page.openEditor(fileEditorInput,
				IEditorRegistry.SYSTEM_INPLACE_EDITOR_ID);
		} else {
			showMessage("No viewer available for this file type. 
			You can download it instead.");
			}
		}
	}
	response.release();
} catch (IOException e) {
	e.printStackTrace();
} catch (CoreException e) {
	e.printStackTrace();
}
}

ファイルのアップロード

ライブラリー (またはフォルダー) のコンテキスト・メニューから「アップロード」を選択することにより、ローカル・ファイルの 1 つを Lotus Quickr に保存するケースを考えてみましょう。これを行うには、ツリー・ノードの TreeParent インスタンスに保存されているフィード URL を使用します。

http://quickr.acme.com/dm/atom/library/5d06ab0044ed8129bd5ebd4caeec5df1/feed

この URL に GET 要求を送信することにより、ライブラリーの内容を取得したことを思い出してください。今度は、この URL にPOST 要求を送信して文書を保存します。これは APP 仕様で定義されており、リソースの作成には POST オペレーションを使用します。POST 要求を送信するとき、要求の本文にファイル・メディアのコンテンツを書き込みます。しかし、サーバーは、ライブラリー内でファイルを保存するときの名前と場所をどのような方法で知るのでしょうか?

その答えは Slug ヘッダーです。Slug ヘッダーにより、ユーザーは Lotus Quickr が文書のファイル名として用いる名前を提供できます。Slug ヘッダーの値には、ライブラリー・ルートからの文書の相対パスを設定します。たとえば、MyFile.doc というファイルをライブラリーの MyFolder フォルダーに保存したいときは、Slug ヘッダーに /MyFolder/MyFile.doc を設定します。プラグインでこれを行うコードをリスト 6 に示します。

リスト 6. ローカル・ファイルを文書ライブラリーに保存するコード
public void doUpload(String url) {
FileDialog dlg = new FileDialog(getViewSite().getShell(), SWT.OPEN);
String path = dlg.open();
if (path != null) {
      File file = new File(path);
      RequestOptions options = new RequestOptions();
      options.setSlug(file.getName());
      options.setContentType("unknown/unkown");
      options.setHeader("Content-Length", String.valueOf(file.length()));
      try {
      	ClientResponse response = httpClient.post(url,
      			new FileInputStream(file), options);
      	if (response.getStatus() != 201) {
      		showMessage(response.getStatusText());
      	} else {
      		ISelection selection = viewer.getSelection();
      		TreeParent parent = (TreeParent) ((IStructuredSelection) selection)
      				.getFirstElement();
      		parent.clear();
      		viewer.refresh(parent);
      	}
      	response.release();
      } catch (FileNotFoundException e) {
      	e.printStackTrace();
      }
}
}

この要求を正しく処理すると、サービスはステータス・コード 201 で応答を返します。また、この応答には、新規作成した文書のコンテンツへの URL を保持する Location ヘッダーが含まれています (edit-media リンクを覚えていますか?)。この情報を使用して、新しい文書ノードを用いてツリーを更新できます。簡単にするために、プラグインは親を更新して新たに追加された文書を表示し、最後に、ファイルがライブラリーに追加され、ツリー内に表示されます。


文書の削除

次に、プラグインを使用してライブラリーから文書を削除する方法を見ていきましょう。これを行うには、ライブラリー・ノード下の各ノードに保存されている自己リンクを使用します。Quickr REST サービスはライブラリー自体の削除はサポートしていないため、ライブラリー・ノードには「削除」メニューを表示しません (リスト 7 参照)。

リスト 7. 文書を削除するコード
public void doDelete(String url) {
	String entryUrl = url;
	if (url.endsWith("/media")) {
		entryUrl = entryUrl.substring(0, url.lastIndexOf('/'));
		entryUrl += "/entry";
	}
	TreeObject item = (TreeObject) ((IStructuredSelection) viewer
			.getSelection()).getFirstElement();
	TreeParent parent = item.getParent();
	RequestOptions options = new RequestOptions();
	options.setHeader("X-Method-Override", "DELETE");
	ClientResponse response = httpClient.post(entryUrl,
			new StringRequestEntity(""), options);
	if (response.getStatus() == 200) {
		parent.clear();
		viewer.refresh(parent);
	}
}

最後に、その他のメニューについて簡単に触れます。「更新」アクションは、ライブラリーまたはフォルダーの内容を取得することと同じです。「ダウンロード」アクションは、すでに「ダブルクリック」アクションの一部として含まれていて、ファイルをダウンロードして起動します。


まとめ

Lotus Quickr REST サービスは、文書を扱うためのシンプルな方法を提供します。操作は REST スタイルの URL を通じて定義されるため、好みのプログラミング言語を使用できます (この記事の例では Java を使用しました)。この記事では、このサービスを使用して文書に基本的な操作を実行する方法を示し、各操作の URL 要求および応答について説明しました。


ダウンロード

内容ファイル名サイズ
QuickrNavigator.zip22KB
QuickrNavigator_1.0.0.jar2.1MB

参考文献

学ぶために

議論するために

コメント

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=Lotus
ArticleID=337794
ArticleTitle=IBM Lotus Quickr REST サービスについて
publish-date=10092007