【VBScript】ServerXMLHTTPでWebAPIにアクセスする


このエントリーはアラタナAdventカレンダー3日目のエントリーです。
2日目は @mather314 さんによるエントリーでした。

平素は大変お世話になっております。アラタナ開発部の @aratana_ogawa です。

アラタナ Advent Calendar 2017 も3日目ですね。今回はASP(VBScript)でWebAPIにアクセスする方法について触れてみようと思います。

ServerXMLHTTP とは

ServerXMLHTTP は、サーバーをセキュリティで保護しながら、異なる Web サーバー間で HTTP アクセスを行うためのメソッドとプロパティを提供します。このオブジェクトを使用して、異なる Web サーバー間で XML/JSON データを交換できます。

実装

さっそく実装してみましょう。例としてQiita APIv2/tags をたたいて vbscript のタグ情報を取得してみます。

Dim oHTTP : Set oHTTP = CreateObject("MSXML2.ServerXMLHTTP")
oHTTP.Open "GET", "https://qiita.com/api/v2/tags/vbscript", False
oHTTP.SetRequestHeader "Content-Type", "application/json"
oHTTP.Send()

Response.write "status: " & oHTTP.status
Response.write "ResponseText: " & oHTTP.ResponseText

Set oHTTP = Nothing

出力結果

status: 200
ResponseText: {"followers_count":96,"icon_url":"https://s3-ap-
northeast-1.amazonaws.com/qiita-tag-
image/0d1729c2a49f71e7c201686d051382a3df4cf96b/medium.jpg?
1434007445","id":"VBScript","items_count":163}

簡単ですね!

少し解説してみます。

oHTTP.Open "GET", "https://qiita.com/api/v2/tags/vbscript", False

Open メソッドで「要求するメソッド」「URL」「非同期通信かどうか」を指定しています。

oHTTP.Send()

Send メソッドでサーバーに HTTP 要求を送信し、応答を受信します。

Response.write "status: " & oHTTP.status
Response.write "ResponseText: " & oHTTP.ResponseText

ここでレスポンスのステータスと内容を文字列として表示しています。
今回はJSONをそのまま表示していますが、実際には "ASPJSON" などのライブラリを使って、JSONをパースすることになると思います。

参考:レガシーASPのJSON入出力用ライブラリ "ASPJSON"のメモ - Qiita

タイムアウトを検知する

より実用的な実装にするため、タイムアウトを検知する方法も紹介しておきます。

Dim oHTTP : Set oHTTP = CreateObject("MSXML2.ServerXMLHTTP")
oHTTP.Open "GET", "https://qiita.com/api/v2/tags/vbscript", True
oHTTP.SetRequestHeader "Content-Type", "application/json"
oHTTP.Send()

If oHTTP.readyState <> 4 Then
    oHTTP.waitForResponse(10)
End If

If oHTTP.readyState = 4 Then
    Response.write "status: " & oHTTP.status
    Response.write "ResponseText: " & oHTTP.ResponseText
Else 
    Response.write "Timeout!"
End If

Set oHTTP = Nothing

これも解説していきます。

oHTTP.Open "GET", "https://qiita.com/api/v2/tags/vbscript", True

まずは非同期フラグを True にするのがポイントです。こうしないと、後述する
waitForResponse がうまく動きません。

If oHTTP.readyState <> 4 Then
    oHTTP.waitForResponse(10)
End If

ここで readyState4、つまり「完了」ではない場合は waitForResponse を使って 10 秒待ちます。

If oHTTP.readyState = 4 Then
    Response.write "status: " & oHTTP.status
    Response.write "ResponseText: " & oHTTP.ResponseText
Else 
    Response.write "Timeout!"
End If

10秒後、readyState4 になればレスポンスを出力し、
そうでなければタイムアウトと判断します。

以上、ServerXMLHTTP について解説してみました。

さいごに

明日は東京から宮崎に移住したエンジニアの話です。
みなさま良い ASP ライフを!

リンク