関連知識の整理

今回使ったXMLHTTP、URLエンコードというテクニックについて、関連知識を整理しておきましょう。

XMLHTTP

Webサービスで提供されるデータの形式のひとつが、図9のようなXML形式です。

図9.XMLデータの例

普段、私たちはブラウザを使って、対話的にWebサービスを利用します。ブラウザは、HTTPというプロトコル(通信規約)に従って、Webサーバーとデータのやり取りをしています。今回はVBAから自動で処理するため、ブラウザの代わりにXMLHTTPオブジェクトという道具を使います。

今回使ったXMLHTTPのメソッドとプロパティは、以下の通りです。

今回使ったXMLHTTPのメソッド

メンバー名 意味 パラメータ
open HTTP接続を開く 第1引数:"GET"または"POST"、第2引数:URLの文字列、第3引数:非同期通信を使用するか(省略可、既定値はTrue)
send HTTPリクエストを送信 第1引数(省略可):送信データ

今回使ったXMLHTTPのプロパティ

メンバー名 意味 データ型 備考
responseText 受信データ(テキスト形式) String(参照のみ) -
statusText 状態 String(参照のみ) OK、Bad Request、Unauthorized、Not Foundなど

これらを用いて図10のように、XMLHTTPオブジェクトの生成→接続→リクエスト送信→ステータス確認→データの取得→オブジェクトの解放、といった手順でリクエストしたデータを取得できます。

図10.XMLHTTPオブジェクトを用いた通信手順

今回のコードにおけるXMLHTTPオブジェクトの動きは、以下の通りです。

a. まずNewコマンドでXMLHTTPオブジェクトを生成し、変数xmlhttpにセットします。
b. openメソッドを発行し、Webサーバーとの接続(通信路)を開きます。第1引数には、楽天Webサービスの仕様に従い"GET"を指定し、第2引数には、URLの文字列を指定します。第3引数は、非同期通信を使用しない(sendメソッドが完了してから次の処理を行う)のでFalseを指定します。
c. sendメソッドで、Webサーバーへのリクエストを発行します。
d. statusTextプロパティで通信の成否を確認します。
e. responseTextプロパティから受信データを一旦テキスト形式のまま、res_txtに格納します。
f. NothingをSetし、XMLHTTPオブジェクトを解放します。

JScriptを用いたURLエンコード

URLの引数に日本語を含む場合は、その文字コードがURLの予約文字(:、/、?、=、&など)と同じになるのを防ぐため、「URLエンコード」と呼ばれる置換を行う必要があります。例えば、Googleで「エンコード」と検索すると、検索結果のURLには、「%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89」といった文字が並びます。これは、ブラウザが自動的にURLエンコードを行っているからです。

今回は自前でURLを組み立てるため、検索条件にURLエンコードを施す必要がありました。 VBAにはURLエンコード置換する関数がありませんので、JScriptのものを借用しました。JScriptは言わばMicrosoft版のJavaScriptで、Windowsに標準装備されているスクリプト言語です。ScriptControlというオブジェクトを利用することで(用例では変数JS)、「JS.CodeObject.関数名」の形式で、JScriptの関数を呼び出せます。

まとめ

いかがだったでしょうか。文庫だけを検索する、レビューの多い順に並べるなど、もっと凝った検索をしたい方は、以下のURLに詳細な仕様が提供されていますので、これを参考にして応用してみるとよいでしょう。 http://webservice.rakuten.co.jp/api/booksbooksearch/ また、取得したデベロッパーIDは、書籍以外の商品検索、オークション商品検索などでも利用できます。

WINGSプロジェクト 遠藤 存著/山田祥寛監修
WINGS プロジェクトについて
テクニカル執筆プロジェクト(代表山田祥寛)。海外記事の翻訳から、主にWeb開発分野の書籍・雑誌/Web記事の執筆、講演等を幅広く手がける。2011年5月時点での登録メンバは35名で、現在も一緒に執筆をできる有志を募集中。