このエントリーはアラタナAdventカレンダー3日目のエントリーです。
2日目は @mather314 さんによるエントリーでした。
平素は大変お世話になっております。アラタナ開発部の @aratana_ogawa です。
アラタナ Advent Calendar 2017 も3日目ですね。今回はASP(VBScript)でWebAPIにアクセスする方法について触れてみようと思います。
ServerXMLHTTP とは
ServerXMLHTTP は、サーバーをセキュリティで保護しながら、異なる Web サーバー間で HTTP アクセスを行うためのメソッドとプロパティを提供します。このオブジェクトを使用して、異なる Web サーバー間で XML/JSON データを交換できます。
実装
さっそく実装してみましょう。例としてQiita APIの v2/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
ここで readyState
が 4
、つまり「完了」ではない場合は waitForResponse
を使って 10 秒待ちます。
If oHTTP.readyState = 4 Then
Response.write "status: " & oHTTP.status
Response.write "ResponseText: " & oHTTP.ResponseText
Else
Response.write "Timeout!"
End If
10秒後、readyState
が 4
になればレスポンスを出力し、
そうでなければタイムアウトと判断します。
◆
以上、ServerXMLHTTP について解説してみました。
さいごに
明日は東京から宮崎に移住したエンジニアの話です。
みなさま良い ASP ライフを!