本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回はゆーすけべーこと和田裕介さんで、テーマはWeb APIです。
はじめに
本連載「Perl Hackers Hub」では、ハッカー向けの話題以外にも、ハッカーによる初歩的なテーマも扱っていきたいと思います。今回のテーマはWeb APIで、Twitterを題材に解説していきます。Web APIはPerlでアプリケーションを作るうえで知っておきたい知識の一つですので、基本と共に実践的なモジュールの使い方まで解説します。また、特にPerlに限らない内容も登場しますので、Perlを触ったことのない方でもWeb APIを触るコツをわかってもらえれば幸いです。
巨人の肩の上に立つ
「巨人の肩の上に立つ」 。この言葉は、かのアイザック・ニュートンが手紙の中に書いた一文と言われていて、最近ではGoogleの論文検索のページ にも引用されています(図1 ) 。
筆者がWeb APIを利用するときは、この言葉をいつも思い出します。Web APIは私たちが巨人たちの肩の上に立つことを可能にしてくれます。
図1 Google Scholar
Web APIとは?
ではWeb APIとは何でしょうか? そもそもAPIは「Application Programming Interface」の略で、ソフトウェアを作るうえでよく使われる言葉です。もちろんPerlの話をするときにも出てきます。たとえばあるモジュールを操作する際のインスタンス化やメソッド呼び出しの「やり方・取り決め」などを指します。「 やり方・取り決め」は、プログラムでの利用される側/する側のインタフェース、つまり境界を定義しています。つまりWeb APIとは、大きなサービスやプラットフォームを外部から利用するためのインタフェースと呼べます。
ありがたいことに最近では、Google やYahoo!、YouTube、Amazon、そして今回例に挙げるTwitterなどの各種サービスが、それらサービスが持つ膨大なデータや有効な機能の一部を一般のユーザに提供するためにWeb APIを公開しています[1] 。たとえばGoogleの各種APIを使えば、キーワードや画像、動画検索の結果を自分のアプリケーションに組み込むことができます。YouTubeのAPIを使えば、動画の検索はもちろん、誰がアップロードしたかや動画の長さはいくつかなどのメタデータも取得できます。動画のアップロード自体を自分の用意したUIから行うこともできます。まさに、Web APIを使って巨人の肩の上に立つことができ、私たちの工夫したアプリケーションを構築できるのです。
Web APIを利用する流れ
HTTPを使ったシンプルな呼び出し
Web APIは「Web」なので、基本的にHTTPプロトコルでやりとりが行われます。各種サービスがWeb APIを提供しだした当初はSOAPという特殊な取り決めを採用するところが多かったのですが、現在はSOAPを使わない、よりシンプルな「呼び出し」を用いるところがほとんどです。ですので、SOAPについては知る必要はないでしょう。
現在主流の呼び出し方では、普段私たちがブラウザで行ってるような、URLを指定してのページの取得や、フォームなどで使われている情報の更新などの方法をそのまま採用しています。具体的に言うと、HTTPのGETメソッドでXMLやJSONを返してもらったり、POSTメソッドで情報を登録するスタイルです。
「HTTP」や「GET」「 POST」といった言葉がわからないという方は、まずそれらについて勉強したほうがよいでしょう。これから出てくる用語も含めWebのアーキテクチャに関する仕様については、山本陽平さんの『Webを支える技術』( 注2 )に非常にうまくまとまっているので参考にしてください。
3つの基本的な流れ
Web API入門として最適な、GETメソッドを用いた情報の取得の一般的な流れを紹介しましょう。次の3つが大まかな流れです(図2 ) 。
① リクエストURIを構築する
② Web APIにリクエストする
③ 結果をパースする
図2 3つの基本的な流れ
① でどのような情報を取得したいかをURIベースで構築します。たとえば検索機能を利用する場合は、キーワードのクエリがURIに入ります。TwitterのSearch APIでキーワード「webdb」を含むツイートを取得したければ、
http://search.twitter.com/search.json?q=webdb
というURIを構築します。URIは、後述するURI::EscapeモジュールなどでURIエスケープをする必要があります。
② でHTTPのGETメソッドを使って構築したURIにアクセスします。
③ で、取得した結果が正しければ、その形式に合わせてパースを行い、あなたのアプリケーションで利用します。レスポンスの形式はXMLが主流ですが、最近ではJSON形式も多くなっています。JSONPで提供されているのであればJavaScriptからの利用もできますね。
POSTメソッドによるWeb APIへの情報登録などの場合も、基本的に流れは同じです。違いは、① で必要になるクエリパラメータの数が情報取得の場合に比べて少なくなる点や、② でGETメソッドではなくPOSTメソッドによるリクエストを行う点などです。
Twitter Search APIを使ってみよう
では、実際にTwitterのWeb APIの一部であるSearch APIを使ってみましょう。
ドキュメントを読むことが重要
あるサービスのWeb APIを利用する第一歩は、そのサービスの公式ドキュメントを読むことです。Web APIを提供しているサービスには、必ず利用方法や規約などを掲載したドキュメントがWeb上で閲覧できる状態になっていますので、それを熟読しましょう。
Twitterの場合はdev.twitter.com で見ることができます。図3 のとおり、すべて英語で書かれています。Twitterのように英語圏発のサービスの場合は、英語のドキュメントのみのケースがあります。英語が苦手な場合でも諦めずに頑張ってみましょう。perldocを読むのと似たような感覚で、コツをつかめば読めると思います。
図3 Twitterのドキュメントサイト
Twitter Search API
さてSearch APIの項 を見てみましょう。基本的にWeb APIのドキュメントで大事なことは共通していて、このページにもしっかりと要点だけが記述されています。
リクエストURI http://search.twitter.com/search.format名
サポートするレスポンスフォーマット JSON、Atom
サポートするリクエストメソッド GET
必須クエリパラメータ q
オプションクエリパラメータ result_type、lang
など
だいたい上記の情報さえあればWeb APIへのリクエストの発行とレスポンスの受け取りが行えます。Twitter Search APIでレスポンスフォーマットはJSON、検索キーワードは「webdb」で検索する場合、次のようになります。
リクエストURI http://search.twitter.com/search.json
レスポンスフェーマット JSON
リクエストメソッド GET
クエリパラメータ q=webdb
リクエストURIとクエリパラメータを組み合わせた最終的なリクエストURIは、以下になります。
http://search.twitter.com/search.json?q=webdb
Webブラウザを使った簡単な検証
上記のURIをWebブラウザのURL欄に入力して、実際にアクセスしてみましょう。JSONのレスポンスが返ってきてコンテンツが表示されたり、ブラウザによってはJSONファイルがダウンロードされると思います(図4 ) 。
図4 WebブラウザによるWeb APIの検証
ここでWebブラウザが行ったようなリクエストの送信と、レスポンスで返ってきたJSONのパースを、これからPerlで行いアプリケーションに組み込んでいくわけです。その前にこうやってWebブラウザベースでWeb APIとのやりとりをサクッと試しておくと、イメージが湧きますし検証になるのでよいでしょう。