ソーシャル・メディア API と XML ベースのデータ・フォーマットとを組み合わせる

XML 方言を使用したソーシャル・メディア・プロバイダー API 対応プログラム

さまざまな API と、RSS (Really Simple Syndication)、Atom、FBML (Facebook Markup Language)、OSML (OpenSocial Markup Language)、SOAP、POX (Plain Old XML) などの XML ベースのデータ・フォーマットを使用してソーシャル・メディア・サイトと対話する方法について、その概念、設計、実装の詳細を探っていきましょう。

J. Jeffrey Hanson, CTO, Max International

Photo of Jeff HansonJeff Hanson は、ソフトウェア・エンジニアおよびアーキテクトとして 20 年以上の経験を持っています。これまで Max International の CTO、Financial Fusion のシニア・アーキテクト、Zareus SOA プラットフォームのチーフ・アーキテクト、eReinsure.com のチーフ・アーキテクトとして、リテール・バンキング、世界市場、抵当貸付、新聞発行、再保険などを対象としたシステムの設計、実装に携わってきました。現在彼は、Java Management Extensions Remote API のエキスパート・グループのメンバー、そして IASA (International Association of Software Architects) のメンバーです。彼はソフトウェア業界向けに数多くの記事と本を執筆しており、そのなかには『Pro JMX, Mashups: Strategies for the Modern Enterprise』や『Messaging Technology IASA IT Architect Skills Library』などがあります。


developerWorks 貢献著者レベル

2009年 12月 01日

この記事が対象とする読者は、ソーシャル・メディア環境を理解し、さまざまな API で XML ベースのデータ・フォーマットを適用する方法を探っている開発者です。興味深いことに XML をベースとしたデータはソーシャル・メディア API の随所で目にします。そのため XML ベースのデータ・フォーマットは、さまざまに異なるサイトとサービスで HTTP プログラミング・モデルを統一し、単純化するのに役立ちます。

ソーシャル・メディアについて

ソーシャル・メディアという言葉は、ユーザーがメディア、コンテンツ、データなどを共有できるサイトおよびサービスを意味します。よく知られているソーシャル・メディア・サイトおよびサービスには、LinkedIn、Facebook、Twitter、MySpace、そして Google で提供している広範にわたるサイトとサービスがあります。ニュース・メディアに関しても、ソーシャル・メディア配信モデルへの転換が急速に進んでいます。

よく使われる頭字語

  • API: Application Program Interface
  • HTML: HyperText Markup Language
  • HTTP: HyperText Transfer Protocol
  • URI: Uniform Resource Identifier
  • URL: Uniform Resource Locator
  • XML: Extensible Markup Language

ソーシャル・メディアの配信手段としては、オンライン・フォーラム、ウェブログ、ウィキ、画像共有、動画共有、ブックマーキング、ソーシャル・アクティビティー・ストリームなどが挙げられます。

ソーシャル・メディア・コミュニティー内でのデータ交換では、XML が大きな役割を果たします。ソーシャル・メディア・プロバイダーはサービスへのアクセス手段として API を提供していますが、これらの API では広範に XML ベースの方言が使用されています。


XML ベースのデータ・フォーマットについて

テキスト・ベースのマークアップ言語であるXML は、多種多様な方言のデータを構造化するために使用されます。XML 方言を定義するスキーマは、関連する XML 文書内に組み込むことができます。よく使用されているプログラミング言語のほとんどが、XML 文書の作成、更新、構文解析をサポートしています。

XML ベースの方言はさまざまな Web サービスで使用されています。Web サービスで使用されている代表的な方言は、POX、RSS、Atom、SOAP ですが、その他にも次々と新しい方言が登場しています。表 1 に、Web サービスでよく使われている XML ベースの方言をいくつか抜粋して説明します。

表 1. Web サービスで一般的に使用されている XML ベースの方言
方言説明
SOAP

SOAP は元々 Simple Object Access Protocol を表していましたが、今では頭字語のような扱いではなくなっています。SOAP は Web サービスのコンテキスト内で構造化データを交換するための XML ベースのプロトコル仕様です。当初、SOAP が対象としていたのはリモート・プロシージャー・コール (RPC) とドキュメント指向のメッセージ交換でした。その後、フォーマット、交換パターン、トランスポート・レベルのバインディングなどを定義する仕様が追加で導入されたことにより、SOAP の複雑さは増していきました。この複雑さのため、SOAP はサービス・プロバイダーやソーシャル・メディア・プロバイダーの間で広く採用されてはいません。

RSSReally Simple Syndication、または Rich Site Summary の略語である RSS は、Web フィード (ブログやニュース、その他のオンライン・データ・ソース) で配信されるデータを構造化するための XML ベースの方言です。RSS 文書を使用することで、パブリッシャーはコンテンツを標準的な方法で素早く配信することができます。RSS コンシューマーは、コンピューター・デスクトップ上のアプリケーション、ブラウザー、あるいはモバイル・デバイスを使用して、RSS サイトから一定の間隔で自動的に更新を取得します。RSS コンシューマーは任意の RSS リーダー・アプリケーションに RSS フィードのアドレスを入力することで、そのフィードを購読します。
AtomAtom 配信フォーマットは、Web フィードに使用する XML ベースの方言です。その使い方は RSS とほとんど同じですが、それぞれの Atom 要素ごとに画像、コンテンツへの外部リンク、メタデータなどを含めることができるという点で、Atom フィードのほうが RSS よりもいくらか包括的です。
FBMLFBML は Facebook Markup Language の略語です。FBML は、アプリケーション開発者が Facebook のサーバー上で動作する HTML サイトを作成できるように Facebook が提供している HTML のサブセットです。
OST および OSMLOST (OpenSocial Template) と OSML (OpenSocial Markup Language) は、Google やその他の OpenSocial ネットワークのメンバーによって定義された XML ベースの方言で、その目的は、開発者が業界で提唱する標準に従ってソーシャル・メディア・アプリケーションおよびサイトを構築し、OpenSocial 準拠のコンテナーで実行できるようにすることです。OST と OSML は、データ駆動型のアプリケーションおよびサービスの開発を促すと同時に、マークアップとプログラミング・ロジックとを明確に切り離せるようにします。

XML データ・フォーマットをソーシャル・メディア API に適用する

ソーシャル・メディア API は、ソーシャル・メディア・プロバイダーが提供するリクエスト/レスポンス型の対話フレームワークです。サード・パーティーのサイトはソーシャル・メディア API を使用することで、ソーシャル・メディア・プロバイダーの機能と対話するサイト、ページ、サービスなどを作成することができます。eBay、Amazon、Google、Facebook、Twitter、OpenSocial は、ソーシャル・メディア・アプリケーションおよびサービスを作成するための API を公開しているプロバイダーの一例にすぎません。以降のセクションでは、これらのプロバイダーが提供する XML をベースとした API の単純な例を紹介します。


eBay

eBay が提供する多数の API によって、開発者はさまざまな操作を行うことができます。具体的には、eBay へのアイテムの出品、現在の eBay のカテゴリー・リストの取得、eBay に掲載されているアイテムに関する情報の表示、アイテムの高額入札者情報の取得、特定のユーザーが販売しているアイテムのリストの取得、特定のユーザーが入札したアイテムのリストの取得、eBay に掲載されているアイテムの他のサイトでの表示、そして売り手に関するフィードバックです。

ユーザーの基本情報を XML 文書として取得する

リスト 1 に記載する HTTP リクエストの例は、eBay ユーザーのデフォルト/基本情報を XML 文書として取得します。

リスト 1. eBay の GetUserProfile
http://open.api.ebay.com/shopping?callname=GetUserProfile
   &responseencoding=XML
   &appid=johndoesAppID
   &siteid=0
   &version=525
   &UserID=johndoesUserID

リスト 2 に、上記と同じリクエストを今度は XML フォーマットで記載します。このリクエストは、HTTP POST を使用して送信することができます。

リスト 2. eBay の GetUserProfile の XML バージョン
<?xml version="1.0" encoding="utf-8"?>
<GetUserProfileRequest xmlns="urn:ebay:apis:eBLBaseComponents">
  <UserID>johndoesUserID</UserID>
</GetUserProfileRequest>

ユーザーの詳細情報を XML 文書として取得する

特定のユーザーに関する追加情報を取得できるように、eBay API では IncludeSelector パラメーターを提供しています。

リスト 3 に、特定ユーザーの詳細情報を取得する HTTP GET リクエストの例を URL フォーマットで記載します。

リスト 3. 詳細を指定した eBay の GetUserProfile
http://open.api.ebay.com/shopping?callname=GetUserProfile
   &responseencoding=XML
   &appid=johndoesAppID
   &siteid=0
   &version=525
   &UserID=johndoesUserID
   &IncludeSelector=Details

上記と同じユーザー詳細情報のリクエストは、XML フォーマットではリスト 4 のようになります。このリクエストは、HTTP POST を使用して送信することができます。

リスト 4. 詳細を指定した eBay の GetUserProfile の XML バージョン
<?xml version="1.0" encoding="utf-8"?>
<GetUserProfileRequest xmlns="urn:ebay:apis:eBLBaseComponents">
  <UserID>hypothetical-user</UserID>
  <IncludeSelector>Details</IncludeSelector>
</GetUserProfileRequest>

リスト 5 は、リスト 3リスト 4 に記載した HTTP リクエストによって取得される典型的なレスポンスの例です。このレスポンスには、ユーザーに関する詳細情報が含まれています。

リスト 5. eBay の GetUserProfile のレスポンス
<?xml version="1.0" encoding="utf-8"?>
<GetUserProfileResponse xmlns="urn:ebay:apis:eBLBaseComponents">
  <Timestamp>2007-11-09T21:05:05.781Z</Timestamp> 
  <Ack>Success</Ack> 
  <Build>e525_core_APILW_5028523_R1</Build> 
  <Version>525</Version> 
  <User>
    <FeedbackScore>1054</FeedbackScore> 
    <FeedbackPrivate>false</FeedbackPrivate> 

    <FeedbackRatingStar>Red</FeedbackRatingStar> 
    <NewUser>false</NewUser> 
    <RegistrationDate>2005-11-01T20:50:00.000Z</RegistrationDate> 
    <RegistrationSite>US</RegistrationSite> 
    <Status>Confirmed</Status> 
    <SellerBusinessType>Undefined</SellerBusinessType> 
    <UserID>johndoesUserID</UserID> 
    <StoreURL>http://stores.ebay.com/johndoesStore</StoreURL> 
    <StoreName>John Doe's Store</StoreName> 
    <SellerItemsURL>
      http://search.ebay.com/_W0LMsarsrjohndoesUserIDQQhtZ-1
    </SellerItemsURL> 
    <AboutMeURL>http://members.ebay.com/aboutme/johndoesUserID</AboutMeURL> 
    <MyWorldURL>http://myworld.ebay.com/johndoesUserID</MyWorldURL> 
    <MyWorldSmallImage>
      http://i2.ebayimg.ebay.com/01/u/000/00/23/animage.JPG?set_id=34
    </MyWorldSmallImage> 
    <MyWorldLargeImage>
      http://i2.ebayimg.ebay.com/01/u/000/77/23/anotherimage.JPG?set_id=34
    </MyWorldLargeImage> 
    <ReviewsAndGuideURL>
      http://search.reviews.us.ebay.com/members/johndoesUserID
    </ReviewsAndGuideURL> 
    <FeedbackDetailsURL>
      http://feedback.ebay.com?ViewFeedback&userid=johndoesUserID&...
    </FeedbackDetailsURL> 
  </User>
</GetUserProfileResponse>

ユーザーの基本情報を SOAP エンベロープとして取得する

リスト 6 に記載する eBay API による HTTP リクエストは、特定ユーザーの基本情報を SOAP レスポンスとして取得する例です。

リスト 6. SOAP レスポンスを要求する eBay の GetUserProfile
http://open.api.ebay.com/shopping?callname=GetUserProfile
   &responseencoding=SOAP
   &appid=johndoesAppID
   &siteid=0
   &version=525
   &UserID=johndoesUserID
   &IncludeSelector=Details

リスト 7 は上記と同じ eBay API によるリクエストですが、SOAP エンベロープという形でユーザー詳細情報を要求しています。

リスト 7. eBay の GetUserProfile リクエストの SOAP エンベロープ・バージョン
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope
  xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <GetUserProfileRequest xmlns="urn:ebay:apis:eBLBaseComponents">
      <UserID>johndoesUserID</UserID>
      <IncludeSelector>Details</IncludeSelector>
    </GetUserProfileRequest>
  </soapenv:Body>
</soapenv:Envelope>

リスト 8 に、SOAP エンベロープとして返されたユーザー詳細情報のレスポンスを記載します。

リスト 8. eBay GetUserProfile の SOAP レスポンス
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope
  xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <GetUserProfileResponse xmlns="urn:ebay:apis:eBLBaseComponents">
      <Timestamp>2009-11-09T20:01:05.781Z</Timestamp> 
      <Ack>Success</Ack> 
      <Build>e525_core_APILW_5028523_R1</Build> 
      <Version>525</Version> 
      <User>
        <FeedbackScore>1047</FeedbackScore> 
        <FeedbackPrivate>false</FeedbackPrivate> 
        <FeedbackRatingStar>Red</FeedbackRatingStar> 
        <NewUser>false</NewUser> 
        <RegistrationDate>2009-10-12T10:10:00.000Z</RegistrationDate> 
        <RegistrationSite>US</RegistrationSite> 
        <Status>Confirmed</Status> 
        <SellerBusinessType>Undefined</SellerBusinessType> 
        <UserID>johndoesUserID</UserID> 
        <StoreURL>http://stores.ebay.com/johndoesStore</StoreURL> 
        <StoreName>John Does Store</StoreName> 
        <SellerItemsURL>
          http://search.ebay.com/_W0LMsarsrjohndoesUserIDQQhtZ-1
        </SellerItemsURL> 
        <AboutMeURL>http://members.ebay.com/aboutme/johndoesUserID</AboutMeURL>
        <MyWorldURL>http://myworld.ebay.com/johndoesUserID</MyWorldURL> 
        <MyWorldSmallImage>
          http://i2.ebayimg.ebay.com/01/u/000/00/23/animage.JPG?set_id=23
        </MyWorldSmallImage> 
        <MyWorldLargeImage>
          http://i2.ebayimg.ebay.com/01/u/000/77/23/anotherimage.JPG?set_id=23
        </MyWorldLargeImage> 
        <ReviewsAndGuideURL>
          http://search.reviews.us.ebay.com/members/johndoesUserID
        </ReviewsAndGuideURL> 
        <FeedbackDetailsURL>
          http://feedback.ebay.com/ws?ViewFeedback&userid=johndoesUserID&...
        </FeedbackDetailsURL> 
      </User>
    </GetUserProfileResponse>
  </soapenv:Body>
</soapenv:Envelope>

Amazon

Amazon では、Amazon のサービス・インフラストラクチャーにアクセスするための機能を公開する、数々の Web サービス API (まとめて Amazon Web サービスと呼ばれます) を提供しています。表 2 に、これらのサービスの一部を抜粋して説明します。

表 2. Amazon Web サービス (抜粋)
サービス説明
EC2 (Elastic Compute Cloud)クラウド内でスケーラブルな計算処理能力を提供するサービス
S3 (Simple Storage Service)Web 上のどこであろうと大量のデータを随時保管および取得するために使用できる単純な Web サービス・インターフェース
CloudFrontコンテンツ配信用 Web サービス
SimpleDBクラウド内で構造化されたデータに対してクエリーを実行するための Web サービス
SQS (Simple Queue Service)クラウドがホストする、分散アプリケーション間でメッセージを移動するためのキュー
ECS (E-Commerce Service)ECS に他の Amazon サービスを統合し、製品データ、カスタマーからのコンテンツ、販売者情報、製品リスト、ショッピング・カードなどを取得する Web サイトやアプリケーションを作成するための機能を提供するサービス

公開ユーザー情報を XML 文書として取得する

以下の例では、Amazon ECS サービスを使用して、特定のカスタマーに関して公開された情報を取得します。この API は、各リクエストがそれぞれの署名によって認証されることを要件とします。リクエストの署名は、リクエスト・タイプ、ドメイン、URI、そしてリクエストに含まれるすべてのパラメーターをソートした文字列を base-64 でエンコードしたものに対し、Amazon Web サービスのシークレット・アクセス・キーを使用して、作成します。

リスト 9 は、Amazon ECS API リクエストの典型的な例で、このリクエストを署名付きリクエストにします。

リスト 9. Amazon CustomerContentSearch リクエスト
http://webservices.amazon.com/onca/xml?
Service=AWSECommerceService
&AWSAccessKeyId=johndoesAccessKeyID
&AssociateTag=johndoesAssociateID
&Operation=CustomerContentSearch
&Name=Jane%20Doe

以下の手順に従うと、リスト 9 のリクエストの署名付きリクエストを作成することができます。

  1. URL にタイムスタンプを追加します。(訳注: 以下の手順では最後までタイムスタンプが含まれていませんが、本来なら「&Timestamp=2009-07-21T16:17:48.000Z」のような行が追加され、この行が手順に応じて変更されるはずです。)
    http://ecs.amazonaws.com/onca/xml?
    Service=AWSECommerceService
    &AWSAccessKeyId=johndoesAccessKeyID
    &AssociateTag=johnDoesAssociateID
    &Operation=CustomerContentSearch
    &Name=Jane%20Doe
  2. このリクエストを URL エンコードします。 リクエストを URL エンコードするということは、URL で使用できない文字を URL で使用できる文字に変換することによって、リクエストの文字列を有効な URL フォーマットに変換するということです。ほとんどのプログラミング言語には、この変換を行う標準ライブラリーまたは関数、あるいはその両方があります。URL エンコードについての詳細な説明は、「参考文献」を参照してください。
  3. クエリー・パラメーターを抽出し、アンパサンド文字 (&) を削除します。
    Service=AWSECommerceService
    AWSAccessKeyId=johndoesAccessKeyID
    AssociateTag=johnDoesAssociateID
    Operation=CustomerContentSearch
    Name=Jane%20Doe
  4. クエリー・パラメーターを ASCII バイト値を基準にソートします。
    AssociateTag=johnDoesAssociateID
    AWSAccessKeyId=johndoesAccessKeyID
    Name=Jane%20Doe
    Operation=CustomerContentSearch
    Service=AWSECommerceService
  5. ソートしたクエリー・パラメーターのリストにアンパサンド (&) を戻します。これにより、リクエストの署名の様式に従った文字列となります。
    AssociateTag=johnDoesAssociateID
    &AWSAccessKeyId=johndoesAccessKeyID
    &Name=Jane%20Doe
    &Operation=CustomerContentSearch
    &Service=AWSECommerceService
  6. リクエストの署名の様式に従った文字列の先頭に、改行を入れたリクエスト・タイプ・ヘッダーを追加します。
    GET
    ecs.amazonaws.com
    /onca/xml

署名の作成対象となる文字列は、リスト 10 のようになります。

リスト 10. Amazon CustomerContentSearch の署名対象の文字列
GET
ecs.amazonaws.com
/onca/xml
AssociateTag=johnDoesAssociateID
&AWSAccessKeyId=johndoesAccessKeyID
&Name=Jane%20Doe
&Operation=CustomerContentSearch
&Service=AWSECommerceService

HMAC と SHA-256

HMAC (Hash-based Message Authentication Code) とは、ハッシュ関数に秘密鍵を組み合わせたメッセージ認証用の暗号メカニズムのことです。

SHA-256 (Secure Hash Algorithm 256) は 32 ビットの暗号ハッシュ関数で、メッセージ認証でデータ・ブロックの信頼性を検証するために使用されます。

詳細については「参考文献」を参照してください。

次に、SHA-256 と Amazon のシークレット・アクセス・キーを使用して、リスト 10 の文字列から RFC (Request for Comments) 2104 準拠の HMAC コードを作成します。これにより、署名文字列はリスト 11 のようになります。

リスト 11. Amazon CustomerContentSearch の署名文字列
Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg=

この署名を URL エンコードします (リスト 12 を参照)。

リスト 12. Amazon CustomerContentSearch の署名文字列の URL エンコード
Nace%2BU3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg%3D

URL エンコードした署名を API リクエストの URL に追加します (リスト 13 を参照)。(訳注: リスト 13 には本来なら上記の署名が URL の最後に「&Sigunature=Nace%2BU3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg%3D」のように追加されるはずです。)

リスト 13. Amazon CustomerContentSearch 署名付きリクエスト
http://ecs.amazonaws.com/onca/xml?Service=AWSECommerceService
   &AWSAccessKeyId=johndoesAccessKeyID
   &AssociateTag=johnDoesAssociateID
   &Name=Jane%20Doe
   &Operation=CustomerContentSearch

CustomerContentSearch で取得される情報の量は、リクエストに指定されたレスポンスのグループと、カスタマーが公開しているデータによって決まります。リスト 14 に、完全な XML カスタマー・データが含まれる典型的なレスポンスを記載します。

リスト 14. Amazon CustomerContentSearch XML レスポンス
<CustomerContentSearchResponse
  xmlns="http://webservices.amazon.com/AWSECommerceService/2005-10-05">
  <OperationRequest>
    <HTTPHeaders>
      <Header Name="UserAgent" Value="Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) 
AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.27 Safari/532.0"></Header>
    </HTTPHeaders>
    <RequestId>0RXAHS524460FBBFDMGJ</RequestId>
    <Arguments>
      <Argument Name="Service" Value="AWSECommerceService"></Argument>
      <Argument Name="Name" Value="Jane Doe"></Argument>
      <Argument Name="Operation" Value="CustomerContentSearch"></Argument>
      <Argument Name="AssociateTag" Value="johnDoesAssociateID"></Argument>
      <Argument Name="Signature" 
Value="SOWM2hnR8zF5b9tyXQEsO0oG0crM7rbSwy1QL7UDfT0="></Argument>
      <Argument Name="AWSAccessKeyId" Value="johndoesAccessKeyID"></Argument>
    </Arguments>
    <RequestProcessingTime>0.104732990264893</RequestProcessingTime>
  </OperationRequest>
  <Customers>
    <Request>
      <IsValid>True</IsValid>
      <CustomerContentSearchRequest>
        <Name>Jane Doe</Name>
      </CustomerContentSearchRequest>
    </Request>
    <TotalResults>1</TotalResults>
    <TotalPages>1</TotalPages>
    <Customer>
      <CustomerId>janedoesCustomerID</CustomerId>
    </Customer>
  </Customers>
</CustomerContentSearchResponse>

公開ユーザー情報を SOAP エンベロープとして取得する

Amazon SOAP リクエストは、ロケール、そしてリクエストにセキュア接続が使用されるかどうかを基準にリクエストのエンドポイントを指定します。表 3 に記載する SOAP エンドポイントは、Amazon Product Advertising API SOAP リクエストに使用することができます。

表 3. Amazon Web サービスの SOAP エンドポイント
ロケールエンドポイント
CAhttp://ecs.amazonaws.ca/onca/soap
https://aws.amazonaws.ca/onca/soap
DEhttp://ecs.amazonaws.de/onca/soap
https://aws.amazonaws.de/onca/soap
FRhttp://ecs.amazonaws.fr/onca/soap
https://aws.amazonaws.fr/onca/soap
JPhttp://ecs.amazonaws.jp/onca/soap
https://aws.amazonaws.jp/onca/soap
UKhttp://ecs.amazonaws.co.uk/onca/soap
https://aws.amazonaws.co.uk/onca/soap
UShttp://ecs.amazonaws.com/onca/soap
https://aws.amazonaws.com/onca/soap

リスト 15 に、Amazon ItemSearch 操作の呼び出しに渡される SOAP エンベロープの例を記載します。

リスト 15. SOAP フォーマットの Amazon CustomerContentSearch レスポンス
<?xml version="1.0" encoding="UTF-8" ?>
<soapenv:Envelope
     xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <ItemSearch xmlns="http://ecs.amazonaws.com/AWSECSCommerce/onca/soap">
      <AWSAccessKeyId>johndoesAccessKeyID</AWSAccessKeyId>
      <Request>
        <SearchIndex>Books</SearchIndex>
        <Keywords>Lord%20of%20the%20Rings</Keywords>
      </Request>
    </ItemSearch>
  </soapenv:Body>
</soapenv:Envelope>

Google

Google では、Web サービス API によって使用可能になる広範なオンライン・サービスの数々を公開しています。これらの API のほとんどで使用されているフォーマットは、XML ベースのリクエスト/レスポンスです。Google インフラストラクチャーの枠内で XML ベースの対話を可能にする Google サービスの例としては、Google Apps があります。

API リクエストを認証する

多くの Google サービスでは、アクセスが許可されてからでないと、情報を交換できないようになっています。そのために使用されているメカニズムの 1 つは、ClientLogin API と呼ばれる API です。Google は、ClientLogin API を使用して許可を受けたアクセスに対し、その後のすべてのリクエストで使用できるトークンを発行します。

リスト 16 に、Google への ClientLogin トークン・リクエストを記載します。

リスト 16. Google ClientLogin リクエスト
https://www.google.com/accounts/ClientLogin?
accountType=HOSTED_OR_GOOGLE
&Email=johndoe@example.com
&Passwd=foobar
&service=apps
&source=mytestapp

リスト 16 のリクエストが正常に処理されると、リスト 17 のようなレスポンスが返ってきます。

リスト 17. Google ClientLogin レスポンス
SID=ABCDE...
LSID= ABCDE...
Auth= ABCDE...

リスト 17 にレスポンスとして記載されたコードのうち、SIDLSID はこの記事の本筋とは離れるため、無視しても構いません。一方、Auth の値は、以降の Google API リクエストで使用できる許可トークンになっています。

セキュリティーで保護された API リクエストでは、正常に返された ClientLogin レスポンスに含まれるトークンを Authorization ヘッダーに設定する必要があります (リスト 18 を参照)。

リスト 18. セキュリティーで保護された Google API リクエストの Google Authorization ヘッダー
Authorization: GoogleLogin auth=ABCDE...

ユーザー・プロファイル情報を Atom フィードとして取得する

cURL

cURL は、URL 構文を使用したオンライン・リクエストを実行するためのコマンドライン・ツールで、FTP、FTPS、HTTP、HTTPS、SCP、SFTP、TFTP、TELNET、DICT、LDAP、LDAPS、他をサポートします。また、cURL は SSL 証明書、HTTP POST、HTTP PUT、FTP アップロード、HTTP フォーム・ベースのアップロード、プロキシー、cookie、ユーザーとパスワードによる認証などもサポートします。

Google Apps は、ユーザー・プロファイル情報をプロファイル・フィードに提供します。プロファイル・フィードは、Google Apps アカウントに関連付けられたユーザーのプロファイルを表示、変更するために使用することができます。プロファイル・フィードを取得するには、Profiles Data API を使用します。

リスト 19 に、johndoe@example.com という Google Apps ユーザーのプロファイルを取得するための標準的な HTTP GET リクエストの例を記載します。このリクエストは cURL コマンドラインとして送信され、上記の例で取得した認証トークンを渡します。

リスト 19. Google からユーザー・プロファイルのフィードを取得するためのリクエスト
curl -k --header "Authorization: GoogleLogin auth=ABCDE..." \
https://apps-apis.google.com/a/feeds/example.com/user/2.0/johndoe

上記の cURL コマンドには、前の ClientLogin リクエストが正常に処理されて返された Auth トークンが組み込まれています。このコマンドの実行が正常に完了すると、リスト 20 に記載するような Atom エントリーが返されるはずです。

リスト 20. Google からユーザー・プロファイルの Atom フィード取得するためのリクエストに対するレスポンス
<?xml version='1.0' encoding='UTF-8'?>
<entry xmlns='http://www.w3.org/2005/Atom'
       xmlns:apps='http://schemas.google.com/apps/2006'
       xmlns:gd='http://schemas.google.com/g/2005'>
  <id>https://apps-apis.google.com/a/feeds/example.com/user/2.0/johndoe</id>
  <updated>1970-01-01T00:00:00.000Z</updated>
  <category
    scheme='http://schemas.google.com/g/2005#kind'
    term='http://schemas.google.com/apps/2006#user'/>
  <title type='text'>John Doe</title>
  <link
    rel='self'
    type='application/atom+xml'
    href='https://apps-apis.google.com/a/feeds/example.com/user/2.0/johndoe'/>
  <link
    rel='edit'
    type='application/atom+xml'
    href='https://apps-apis.google.com/a/feeds/example.com/user/2.0/johndoe'/>
  <apps:login
    userName='johndoe'
    suspended='false'
    ipWhitelisted='false'
    admin='true'
    changePasswordAtNextLogin='false'
    agreedToTerms='true'/>
  <apps:quota limit='7168'/>
  <apps:name familyName='Doe' givenName='John'/>
  <gd:feedLink
    rel='http://schemas.google.com/apps/2006#user.nicknames'
    href='https://apps-
apis.google.com/a/feeds/example.com/nickname/2.0?username=johndoe'/>
  <gd:feedLink
    rel='http://schemas.google.com/apps/2006#user.emailLists'
    href='https://apps-
apis.google.com/a/feeds/example.com/emailList/2.0?recipient=johndoe%example.com'/>
</entry>

ユーザー・プロファイル情報を RSS フィードとして取得する

Google API の多くは、結果を RSS フォーマットとして返すようにパラメーター化することができます。通常、そのためには入力リクエストに 1 つのパラメーターを設定します。

cURL を使用して、前の例と同じ johndoe@example.com のプロファイルを今度は RSS 項目として取得するには、リスト 21 のコマンド行を実行します。

リスト 21. Google からユーザー・プロファイルの RSS フィードを取得するためのリクエスト
curl -k --header "Authorization: GoogleLogin auth=ABCDE..." \
https://apps-apis.google.com/a/feeds/example.com/user/2.0/johndoe?alt=rss

上記の cURL コマンドが正常に完了すると、そのレスポンスとしてリスト 22 に記載するような RSS エントリーが返されます。

リスト 22. Google からユーザー・プロファイルの RSS フィードを取得するためのリクエストに対するレスポンス
<?xml version='1.0' encoding='UTF-8'?>
<item xmlns:atom='http://www.w3.org/2005/Atom'
      xmlns:apps='http://schemas.google.com/apps/2006'
      xmlns:gd='http://schemas.google.com/g/2005'>
  <guid isPermaLink='false'>
    https://apps-apis.google.com/a/feeds/example.com/user/2.0/johndoe
  </guid>
  <atom:updated>1970-01-01T00:00:00.000Z</atom:updated>
  <category domain='http://schemas.google.com/g/2005#kind'>
    http://schemas.google.com/apps/2006#user
  </category>
  <title>John Doe</title>
  <apps:login
    userName='johndoe'
    suspended='false'
    ipWhitelisted='false'
    admin='true'
    changePasswordAtNextLogin='false'
    agreedToTerms='true'/>
  <apps:quota limit='7168'/>
  <apps:name familyName='Doe' givenName='John'/>
  <gd:feedLink
    rel='http://schemas.google.com/apps/2006#user.nicknames'
    href='https://apps-
apis.google.com/a/feeds/example.com/nickname/2.0?username=johndoe'/>
  <gd:feedLink
    rel='http://schemas.google.com/apps/2006#user.emailLists'
    href='https://apps-
apis.google.com/a/feeds/example.com/emailList/2.0?recipient=johndoe%40example.com'/>
</item>

Facebook

Facebook は開発者向けに、ユーザー間で情報を共有し、ユーザー同士のつながりを維持できるようにするアプリケーションを作成するための Facebook Platform をリリースしました。Facebook で実行するアプリケーションを作成するには、前に表 1 で説明した FBML マークアップ言語を使用します。

FBML を使用したログイン・ボタン・ページ

Facebook では、Facebook のサービスおよびデータと対話するページを作成するためのメカニズムとして FBML を提供しています。リスト 23 に記載する FBML 対応のページで組み立てているのは、Facebook Platformに対してユーザーを認証するログイン・ボタンです。このボタンは、あらゆる HTML ページに組み込むことができます。

リスト 23. FBML 対応のページ
<html>
<head>
<title>test</title>
</head>
<body>
<script
src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php/en_US"
type="text/javascript">
</script>
<script type="text/javascript">
  FB.init("ff60291faf5de5c350fab4d4cc84b9cb");
</script>
 
 <fb:login-button length="short" size="medium"></fb:login-button>
 <br/>
 <fb:profile-pic uid="loggedinuser" size="square" facebook-logo="true">
 </fb:profile-pic>
 <br/> 
 <fb:name uid="loggedinuser" useyou="false" linked="true"></fb:profile-pic>
 <br/> 
 <div id="profile_pics"></div>
<script type="text/javascript">
var widget_div = document.getElementById("profile_pics");
FB.ensureInit(function () {
  FB.Facebook.get_sessionState().waitUntilReady(function() {
  FB.Facebook.apiClient.friends_get(null, function(result) {
    var markup = "";
    var num_friends = result ? Math.min(5, result.length) : 0;
    if (num_friends > 0) {
      for (var i=0; i<num_friends; i++) {
        markup += 
          '<fb:profile-pic
             size="square"
             uid="'+result[i]+'"
             facebook-logo="true"></fb:profile-pic>';
      }
    }
    widget_div.innerHTML = markup;
    FB.XFBML.Host.parseDomElement(widget_div);
  });
  });
});
</script>
</body>
</html>

リスト 23 の FBML フォームを構文解析すると、図 1 のレスポンスがレンダリングされます。

図 1. FBML でレンダリングされたレスポンス
FBMLでレンダリングされたレスポンスのスクリーン・キャプチャー。Facebook ログイン・ボタン・ページが示されています。

XFBML を使用したログイン・ボタン・ページ

Facebook が FBML のサブセットとして提供している XFBML を使用すれば、Facebook Connect を使って FBML ベースのページを HTML ページに統合したり、iframe 内で FBML を使用したりすることができます。

リスト 24 で組み立てるログイン・ボタンは、Facebook Connect プラットフォームに対してユーザーを認証します。このボタンも、あらゆる HTML ページに組み込むことができます。

リスト 24. XFBML 対応のページ
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" 
xmlns:fb="http://www.facebook.com/2008/fbml">
<head>
<title>test</title>
</head>
<body>
 <script 
src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php/en_US" 
type="text/javascript"></script>
 <fb:login-button></fb:login-button>
 <script type="text/javascript">  FB.init("ff60291faf5de5c350fab4d4cc84b9cb", 
"xd_receiver.htm"); </script>
</body>
</html>

リスト 24 の XFBML フォームを構文解析すると、図 2 のレスポンスがレンダリングされます。

図 2. XFBML でレンダリングされたレスポンス
XFBMLでレンダリングされたレスポンスのスクリーン・キャプチャー。Facebook ログイン・ボタンが示されています。

Twitter

REST

REST (Representational State Transfer) は、分散システムを対象としたソフトウェア・アーキテクチャーおよび対話モデルです。Representational State Transfer という言葉は、Roy Fielding (HyperText Transfer Protocol バージョン 1.0 および 1.1 を作成した 1 人) の博士論文で初めて紹介され、定義されました。詳細については「参考文献」を参照してください。

Twitter は Web 全体に広がってきています。その理由は主に、Twitter では開発者が API を使って簡単にサービスを使用できるようにしているからです。Twitter の API は REST をベースとしているため、結果を XML、JSON (JavaScript Serialized Object Notation)、RSS、そして Atom フィードのフォーマットで返すことができます。

Twitter の公開タイムラインを RSS フィードとして取得する

Twitter では、ユーザーが API のレスポンスをさまざまなフォーマットで取得することができます。その一例は、RSS です。リスト 25 に記載する cURL コマンド行を使用した Twitter API リクエストは、Twitter から公開タイムラインを RSS フィードとして取得する例です。

リスト 25. Twitter 公開タイムラインのリクエスト
curl http://twitter.com/statuses/public_timeline.rss

上記の cURL コマンドが正常に完了すると、そのレスポンスとしてリスト 26 に記載するような RSS フィードが返されます。

リスト 26. Twitter 公開タイムラインのレスポンス
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title>Twitter public timeline</title>
    <link>http://twitter.com/public_timeline</link>
    <atom:link type="application/rss+xml" 
href="http://twitter.com/statuses/public_timeline.rss" rel="self"/>
    <description>Twitter updates from everyone!</description>
    <language>en-us</language>
    <ttl>40</ttl>
  <item>
    <title>Here is a tweet title</title>
    <description>Here is a tweet description</description>
    <pubDate>Tue, 10 Nov 2009 18:28:16 +0000</pubDate>
    <guid>http://twitter.com/astrogerly/statuses/1234567890</guid>
    <link>http://twitter.com/astrogerly/statuses/1234567890</link>
  </item>
  <item>
    <title>Here is another tweet title</title>
    <description>Here is another tweet description</description>
    <pubDate>Tue, 9 Nov 2009 14:32:11 +0000</pubDate>
    <guid>http://twitter.com/astrogerly/statuses/6789012345</guid>
    <link>http://twitter.com/astrogerly/statuses/6789012345</link>
  </item>
  ...
  </channel>
</rss>

友達のタイムラインを XML として取得する

必要とあれば、Twitter API は結果を POX (Plain Old XML) として返すこともできます。それには、リクエスト URL の最後に「xml」を追加します。

API のなかには、認証されないとアクセスできないものもあります。認証の手段は、リクエストと併せて渡す単純なユーザー名とパスワードのペアです。

cURL を使用して Twitter の特定ユーザーの友達のタイムラインを取得するには、リスト 27 のコマンド行を実行します。

リスト 27. Twitter の友達のタイムラインのリクエスト
curl -u johndoe:johndoespassword http://twitter.com/statuses/friends_timeline.xml

リスト 27 のコマンド行には、API を実行するための username:password ペアが含まれていることに注意してください。

上記の cURL コマンドが正常に完了すると、そのレスポンスとしてリスト 28 に記載するような XML 文書が返されます。

リスト 28. Twitter の友達のタイムラインのレスポンス
<?xml version="1.0" encoding="UTF-8"?>
<statuses type="array">
  <status>
    <created_at>Tue Nov 10 16:50:40 +0000 2009</created_at>
    <id>1234567890</id>
    <text>Tweet shown here</text>
    <source>web</source>
    <user>
      <id>7654321</id>
      <name>atwitterusername</name>
      <screen_name>atwitterscreenname</screen_name>
      <location>Worldwide...</location>
      <description>User description</description>
      ...
    </user>
  </status>
  <status>
    <created_at>Tue Nov 9 14:33:22 +0000 2009</created_at>
    <id>1234567890</id>
    <text>Another tweet shown here</text>
    <source>web</source>
    <user>
      <id>1234567</id>
      <name>anothertwitterusername</name>
      <screen_name>anothertwitterscreenname</screen_name>
      <location>Worldwide...</location>
      <description>Another user description</description>
      ...
    </user>
  </status>
  ...
</statuses>

Twitter の公開タイムラインを Atom フィードとして取得する

Twitter API では結果を Atom フォーマットで返すことも可能です。この場合も同じく、リクエスト URL の最後に「atom」を追加します。すると、結果は Atom フォーマットで返されることになります。リスト 29 の cURL コマンド行はその一例です。

リスト 29. Atom フィードでの Twitter 公開タイムラインのリクエスト
curl http://twitter.com/statuses/public_timeline.atom

上記の cURL コマンドが正常に完了すると、そのレスポンスとしてリスト 30 に記載するような Atom フィードが返されます。

リスト 30. Twitter の公開タイムラインの Atom フィードでのレスポンス
<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <title>Twitter public timeline</title>
  <id>tag:twitter.com,2007:Status</id>
  <link type="text/html"
        href="http://twitter.com/public_timeline"
        rel="alternate"/>
  <link type="application/atom+xml"
        href="http://twitter.com/statuses/public_timeline.atom"
        rel="self"/>
  <updated>2009-11-10T18:48:25+00:00</updated>
  <subtitle>Twitter updates from everyone!</subtitle>
    <entry>
      <title>username: @Here is a tweet</title>
      <content type="html">username: @Here is a tweet</content>
      <id>
        tag:twitter.com,2007:http://twitter.com/username/statuses/1234567890
      </id>
      <published>2009-11-10T18:48:25+00:00</published>
      <updated>2009-11-10T18:48:25+00:00</updated>
      <link type="text/html"
            href="http://twitter.com/username/statuses/1234567890"
            rel="alternate"/>
      <link type="image/jpeg"
            href="http://a3.twimg.com/profile_images/1234567890/userimage.JPG"
            rel="image"/>
      <author>
        <name>User Name</name>
      </author>
    </entry>
    <entry>
      <title>anotherusername: @Here is another tweet</title>
      <content type="html">anotherusername: @Here is another tweet</content>
      <id>
        tag:twitter.com,2007:http://twitter.com/anotherusername/statuses/6789012345
      </id>
      <published>2009-11-09T16:42:15+00:00</published>
      <updated>2009-11-09T16:42:15+00:00</updated>
      <link type="text/html"
            href="http://twitter.com/anotherusername/statuses/6789012345"
            rel="alternate"/>
      <link type="image/jpeg"
            href="http://a3.twimg.com/profile_images/6789012345/userimage.JPG"
            rel="image"/>
      <author>
        <name>Anotheruser Name</name>
      </author>
    </entry>
</feed>

OpenSocial

OpenSocial は、ソーシャル・メディア・アプリケーションおよびサービスに共通の API およびマークアップ言語を定義しようと目指している組織 (Google、MySpace、その他) からなるコンソーシアムです。OpenSocial グループによって定義された主要なマークアップ言語には、OSML (OpenSocial Markup Language) と OST (OpenSocial Template) があります。

OST による宣言型マークアップ

宣言型マークアップ言語である OST が目的としているのは、ガジェットの開発者たちが再利用可能なテンプレートを作成して、これらのテンプレートをデータ駆動型のアプリケーションとサイトの構築に使用できるようにすることです。OST 実装は、OST コードがクライアントのブラウザーに送られる前に、これを構文解析して実行します。このプロセスでは、データの取得、保管、インジェクションなどを行った上で、ブラウザー内でデータをレンダリングすることができます。

OST 内での OSML の使用

OSML が定義する一連のタグは、あらゆる OpenSocial 準拠のコンテナーが構文解析し、レンダリングすることができます。OST ページ内に含まれる OSML タグは、ユーザーのプロファイル情報や友達のリストといったデータを取得するために使用されます。

OST/OSML を使用してユーザーの友達を取得する

リスト 31 に記載する OST/OSML ガジェットの例に、OSML PeopleRequest タグを使用してユーザーの友達を取得する方法を示します。取得する友達のリストは、userId 属性と groupId 属性によって指定されます。指定された友達のリストが、ページの実行時に OST コンテナーによってレンダリングされます。

リスト 31. OpenSocial OST/OSML ガジェット
<?xml version="1.0" encoding="UTF-8"?>
<Module>
  <ModulePrefs title="Server-side Template">
    <Require feature="opensocial-data" />
    <Require feature="opensocial-templates">
    </Require>
  </ModulePrefs>
  <Content type="html">
    <![CDATA[      
      <script xmlns:os="http://ns.opensocial.org/2008/markup" type="text/os-data">
        <os:PeopleRequest key="friends" userId="@viewer" groupId="@friends"/>
      </script>
 
      <script type="text/os-template">
        <ul>
          <li repeat="${friends}">
            <span id="id${Context.Index}">${Cur.name.givenName}</span>
          </li>
        </ul>
     </script>
    ]]>
  </Content>
</Module>

まとめ

ユーザーがコンテンツやメディアなどを共有できるようにする技術、手法、API として、ソーシャル・メディアは急速な広がりを見せています。この時代の流れは、もちろん無視することができません。ソーシャル・メディアは LinkedIn、Facebook、Twitter などのサイト、そして Google が提供する多種多様なサイトとサービスで一般的に使用されています。

この記事では、さまざまな API と、XML ベースのデータ・フォーマット (RSS、Atom、FBML、OSML、SOAP、および単純な XML) を使用してソーシャル・メディア・サイトと対話する際の概念、設計、実装の詳細を説明しました。

参考文献

学ぶために

製品や技術を入手するために

  • cURL: URL 構文でファイルを転送するためのコマンド行ツールをダウンロードして、その詳細を探ってください。
  • IBM 製品の評価版: DB2®、Lotus®、Rational®、Tivoli®、および WebSphere® のアプリケーション開発ツールとミドルウェア製品を体験するには、評価版をダウンロードするか、IBM SOA Sandbox のオンライン試用版を試してみてください。

議論するために

コメント

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=XML, Open source
ArticleID=460703
ArticleTitle=ソーシャル・メディア API と XML ベースのデータ・フォーマットとを組み合わせる
publish-date=12012009