目次


作って学ぶ、今どきのWebサービス

第4回 Webサービスって実はこんなに簡単

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: 作って学ぶ、今どきのWebサービス

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:作って学ぶ、今どきのWebサービス

このシリーズの続きに乞うご期待。

前回まで3回(連載第1回第2回第3回)に渡って、PerlプログラムからWeb上のコンテンツを取得するLWPと、LWPで取得したXML文書を料理するためのXMLモジュールの利用方法を学びました。いずれもPerlにおけるWebプログラミングの基礎となるものでした。今回は一歩進めて、より実用的なアプリケーションを作るため、その足がかりとなるであろうXML Webサービスの使い方について解説していきたいと思います。

XML Webサービスって?

前回も少し触れましたが、XML Webサービス(以下、Webサービス)について少しおさらいしておきましょう。

Webサービスとは「あるWebサイトが持つ機能をほかのアプリケーションから利用できるよう、その機能をコンポーネント化しXMLによるAPIとして公開したもの」です。もう少し簡単にいうと、Webサイトの検索機能とかショッピングサイトのカート機能などを、ほかのアプリケーションから利用できるよう「開発者向けに」作られた機能、といったところでしょうか。

例えばあなたが、ローカルPC上で動作するアプリケーションを開発していたとしましょう。そのアプリケーション内に、世界中のWebサイトから全文検索する機能を搭載したいと思ったときに、どのような手段でそれを実現するでしょうか。自分で世界中のWebサイトからデータを集めてきて、検索するプログラムを作りますか?とてもじゃないですが、無理ですね。それはあのGoogleが何万台ものコンピュータを使ってようやく実現できている世界なのですから。

でももしGoogleが検索機能をWebサービスとして公開していれば、それを利用することであなた自身は検索のプログラムをほとんど書くことなく、そのアプリケーションに世界中のWebサイトからの全文検索機能、例えばGoogleエンジンによる検索機能を搭載できるのです。

つまりWebサービスとは、Webサイトにおける特定機能を、アプリケーション用インタフェース(=API)としてWeb上で公開したものといえます。WebサービスAPIはいろいろなプログラミング言語から利用できるよう、多くの場合XMLが使われています。

「PerlでWebサービスを利用する」とは、このXML文書を取りに行き、返ってきた結果をパース*して、その機能やデータを取り込む、といったプログラムを書くことです(前回学んだLWPとXMLモジュールの使い方を知っていれば利用できる、ということでもあります)。

まだ少しもやもやしているでしょうか。ここから先は具体例を示した方が分かりやすそうですね。

Google Web APIsとYahoo! Search Web Services

先ほど「Googleが検索機能をWebサービスとして公開していれば」と書きました。実は、Googleは実際にWebサービスとしてその検索機能を公開していて、「Google Web APIs」という名前がつけられています。

また、GoogleのライバルであるところのYahoo!も、2005年3月1日から検索のWebサービスを開始しました。こちらは「Yahoo! Search Web Services」という名前で公開されています。

Yahoo! Search Web Services
Yahoo! Search Web Services
Yahoo! Search Web Services

Webサービスの実例としては、これら検索のAPIが比較的シンプルで分かりやすいと思います。ここで1つ、検索APIを使った簡単なアプリケーションを作ってみます。まずはAPIの扱いが簡単なYahoo! Search Web Servicesから使ってみましょう。

Application IDを取得する

Yahoo! Search Web Servicesを利用するには、Application IDが必要です。IDは開発者登録をすることで取得可能で、開発者登録を行うためにはYahoo!のアカウントが必要です。ということで、Yahoo!のアカウントを持っていない方はサインアップしてアカウントを取得しましょう。

Yahoo!にサインアップしてアカウントを取得したら、Yahoo!にログインして「get an application ID」のリンクからIDを取得します。登録フォームに8~40文字で任意の文字列を送信すると、それがApplication IDとして利用可能になります。

Yahoo! Search Web Servicesを使ってみよう

Yahoo! Search Web Servicesでは、Web検索以外にもイメージ検索やニュース検索、ビデオ検索なども利用可能です。それぞれのAPIとWeb検索の使い方は「Yahoo! Search Web Services」の右側に記載されています。

Yahoo! Search Web Servicesのアーキテクチャーはとてもシンプルで、「HTTPリクエストのクエリパラメータに検索語句などを指定してHTTPのGETメソッドでアクセスすると、検索結果がXMLで返却されてくる」というものです。

例えばキーワード「hatena」で検索するには、リスト1のURLにGETリクエストを送信すれば良く*、その応答はリスト2のようなXML文書で返ってきます(一部省略しています)。XMLの中身は、斜め読みでもだいたい分かりますね。検索結果が何件か入っていて、それぞれにタイトルや要約、そのURLなどがセットになっているといった具合です。

リスト1「hatena」でWeb検索をするURL
http://api.search.yahoo.com/WebSearchService/V1/webSearch?appid=********&query=hatena&
type=all&results=10&start=1&format=any&language=ja

すでにお気づきかと思いますが、前回解説した方法を使えばこのAPIを料理するのは簡単です。そう、LWPで先のURLをGETして、返却されてきたXML文書をXML::SimpleなどのモジュールでパースすればOKです。

リスト2「hatena」でWeb検索をしたときのレスポンス
<?xml version="1.0" encoding="UTF-8"?>
<ResultSet
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="urn:yahoo:srch"
   xsi:schemaLocation="urn:yahoo:srch http://api.search.yahoo.com/
			WebSearchService/V1/WebSearchResponse.xsd"
   totalResultsAvailable="4435952"
   totalResultsReturned="10"
   firstResultPosition="1">
   <Result>
     <Title>はてな</Title>
     <Summary>知りたいページを文章でたずねてください...</Summary>
     <Url>http://www.hatena.ne.jp/</Url>
     <ClickUrl>http://rds.yahoo.com/S=96857362/K=hatena/v=2/...</ClickUrl>
     <ModificationDate>1117868400</ModificationDate>
     <MimeType>text/html</MimeType>
   </Result>
   <Result>
     <Title>はてなダイアリー- キーワードでつながる面白ブログ</Title>
     <Summary>関連サービス. キーワード. はてなダイアリーへようこそ...</Summary>
     <Url>http://d.hatena.ne.jp/</Url>
     <ClickUrl>http://rds.yahoo.com/S=96857362/K=hatena/v=2/...</ClickUrl>
     <ModificationDate>1117868400</ModificationDate>
     <MimeType>text/html</MimeType>
     <Cache>
       <Url>http://rds.yahoo.com/S=96857362/K=hatena/v=2/XP=yws/...</Url>
       <Size>25191</Size>
     </Cache>
   </Result>
                    :
                    :
</ResultSet>

LWPとXML::SimpleでYahoo! Search Web Servicesを料理する

それでは具体的にPerlで検索のアプリケーションを書いてみましょう。任意の検索語句を渡すと、その検索結果のタイトルを10件出力するという(実行例1)、簡単なコマンドラインアプリケーションです。

実行例1検索結果のタイトルを10件ほど出力するアプリケーション
$ perl yahoosearch.pl はてな
はてな
はてなダイアリー- キーワードでつながる面白ブログ
はてなアンテナ
はてなへの住所登録の義務化撤回について
はてな義援金窓口
「日本人にはBlogより日記」、はてなの人気に迫る- CNET Japan
はてなグループ
はてな- Wikipedia
はてな?
はてな検索

コードはリスト3のようになります。

リスト3Yahoo! Search Web Servicesを利用するアプリケーション
#!/usr/local/bin/perl
use strict;
use Jcode;
use LWP::Simple;
use URI::Escape;
use XML::Simple;

my $query = shift or die "usage: $0 <query>";
$query = Jcode->new($query, 'euc')->utf8;
$query = uri_escape($query);
my $url = "http://api.search.yahoo.com/WebSearchService/V1/webSearch?appid=********&
query=$query&type=all&results=10&start=1&format=any&language=ja";

my $document = LWP::Simple::get($url)
   or die "cannot get content from $url";

my $parser = XML::Simple->new;
my $data = $parser->XMLin($document);

for (@{$data->{Result}})
{
    print Jcode->new($_->{Title}, 'utf8')->euc , "\n";
}

今回利用するモジュールは、

  • Jcode
  • LWP::Simple
  • URI::Escape
  • XML::Simple

の4つです。LWPとXML::Simpleは前回解説したとおり。Yahoo! Search Web Servicesでは入力も出力もマルチバイト文字をUTF-8で扱うことになっているので、Jcodeは文字コードを変換するために利用します*。また、URI::EscapeはクエリパラメータをURLエンコードするために利用しています。

特に難しいところはないですね。大枠は前回解説したコードとほとんど一緒です。クエリパラメータ付きのURLを先に組み立てておいて、LWP::SimpleでそれをGET。取得したXML文書をXML::Simpleでパースしてタイトルに当たる個所だけを出力、ということを行っています。

具体例を見て、Webサービスとは何かをつかんでいただけたでしょうか。Webサービスを利用することで、Webを介してXMLをやり取りして、任意のアプリケーションにWebサイトの機能(ここではYahoo!の検索)を取り込むことができました。

ここでは入力をスクリプト実行時の引数、出力を標準出力にしていますが、この入力をWebから、出力をWebに書き換えれば、Webアプリケーションとして検索ページが作れます(このあたりは今後解説したいと思います)。

Yahoo::Searchでよりお手軽に

さて、リスト3ではLWP::SimpleとXML::Simpleを使っていますが、CPANを探すとYahoo::Searchというモジュールが見つかると思います。これはYahoo! Search Web Services専用のモジュールで、Yahoo!社員がCPANに登録しているものです。

LWPとXML::Simpleも良いですが、このモジュールを使うと*、もっとシンプルかつすっきりとしたコードで同じ機能のプログラムが書けます(リスト4)。

リスト4Yahoo::Searchを使った場合
#!/usr/local/bin/perl
use strict;
use Yahoo::Search;

my $query = shift or die "usage: $0 <query>";

my @Results = Yahoo::Search->Results(
    Doc => $query,
    AppId => '********',
    Mode => 'all',
    Start => 0,
    Count => 10,
    Type => 'any',
    Language => 'ja',
);

for (@Results) {
    print $_->Title, "\n";
}

URLの組み立てや、XML::Simpleが作った生のデータ構造をたどったりする必要がなくなり、かなり分かりやすくなったと思いませんか?このように、CPANには特定のWebサービス専用のモジュールなどもあるという好例といえるでしょう。

SOAPとREST

ところで、Webサービスに関係する言葉で、SOAP(Simple Object Access Protocol)というものを聞いたことがあるかもしれません。SOAPとは、WebサービスにおけるXML文書交換用のプロトコルのことです。

ここで示したYahoo! Web Search APIではSOAPは利用していません。Yahoo! Web Searchのように、HTTPのGETでURLにアクセスしてシンプルにXML文書を取得するAPIは、REST API(あるいはXML over HTTP)などと呼ばれます。

Google Web APIsはSOAPを採用しています。今回はSOAPによるWebサービスの解説は省略しますが、SOAPによるWebサービスはPerlならSOAP::Liteを使ってHackすると良いでしょう。

次回は

今回はGoogleとYahoo!の検索機能に関するWebサービスを題材に解説してきました。しかしながら、実用的なアプリケーションを作ると言いつつも、Web検索の機能をアプリケーションに統合するだけでは、いまいち面白みがありません。工夫次第でいろいろ面白いものが作れるとは思いますが、より実用的なデータをWebサービスで扱いたいところですね。

そこで次回は、Amazon.comが提供するAmazon Webサービスを題材にしたいと思います。

このページで出てきた専門用語

パース
文法に沿ってデータを分析・分解すること。
リスト1のURLにGETリクエストを送信すれば良く
「********」の部分には先に取得したApplication IDが入ります。また、ここでは「language=ja」で日本語の結果にのみ絞っています。
Jcodeは文字コードを変換するために利用します
Perl 5.8ではこれまでEncodeモジュールを利用するのが一般的でしたが、EncodeのラッパーモジュールとしてJcode 2.xも利用可能です。こちらの方が使いやすいので、今後は日本語の変換にはJcodeを使っても良いでしょう。
このモジュールを使うと
コンストラクタに渡しているそれぞれのパラメータの説明は、Yahoo::Searchのperldocかsearch.cpan.orgのドキュメントを参照してください。

ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Web development, Open source, Java technology
ArticleID=247528
ArticleTitle=作って学ぶ、今どきのWebサービス: 第4回 Webサービスって実はこんなに簡単
publish-date=03302007