関連知識の整理
今回使ったXMLHTTP、URLエンコードというテクニックについて、関連知識を整理しておきましょう。
XMLHTTP
Webサービスで提供されるデータの形式のひとつが、図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オブジェクトの生成→接続→リクエスト送信→ステータス確認→データの取得→オブジェクトの解放、といった手順でリクエストしたデータを取得できます。
今回のコードにおける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名で、現在も一緒に執筆をできる有志を募集中。