Excel から REST API を経由して Wagby を操作する [1] 基本形

最終更新日: 2020年6月9日

サンプルアプリケーションの動作

顧客モデル

ここでは図1に示す、簡単な顧客モデルを例に説明します。

図1 顧客モデルの定義

ビルド後、アプリケーションを起動します。サンプルデータとして、図2に示すような2件を事前に登録しておきます。

図2 サンプルデータ

Excelを起動する

REST API を利用するプログラム (VBA) が含まれる Excel ファイルを開きます。 このとき、Wagby アプリケーションは起動した状態としてください。Excel から HTTP 通信を行うためです。

図3 サンプルアプリケーションを起動する

顧客ID (ここでは "1000")を入力し、「データを取得」ボタンを押下します。

図4 顧客IDを指定してデータを取得する

Wagby のデータを取得できました。(図5)

図5 Wagbyからデータを取得して表示した

顧客IDを変更すると、取得データも変わります。(図6)

図6 別のデータを取得する

VBAの説明

サンプルアプリケーションは、Excel VBA で記述されています。その内容を確認してみます。 ここでは Excel 2007 を使って説明します。

「マクロ」を開きます。

図7 マクロを開く

マクロ名 "sample" を編集します。

図8 マクロを編集する

コードが表示されます。

図9 コードが表示された

コードの説明

本アプリケーションで利用しているVBAのコードを転載します。

Sub sample()
  '--------------------------------------------------------------------
  '  変数定義
  '--------------------------------------------------------------------
  Dim objHttpReq As Object          ' XMLHTTP オブジェクト
  Dim strJSON As String             ' レスポンスで受け取るJSONデータ
  Dim strURL As String              ' アクセス先URL
  Dim objJSON As Object             ' レスポンスの JSON 文字列をパースした情報を格納
  '------------------------------------------------------------------
  ' 検索文字付きURLを作成する
  '------------------------------------------------------------------
  strURL = "http://localhost:8921/wagby/rest/customer/entry/" & Range("C2").value
  '------------------------------------------------------------------
  ' XMLHTTP オブジェクトを生成する
  '------------------------------------------------------------------
  Set objHttpReq = CreateObject("MSXML2.XMLHTTP")
  objHttpReq.Open "GET", strURL, False
  '------------------------------------------------------------------
  ' XMLHTTP のリクエストヘッダーを指定する
  '------------------------------------------------------------------
  ' ログイン認証
  objHttpReq.setRequestHeader "X-Wagby-Authorization", "YWRtaW46YWRtaW4="
  'ドメイン名:ポート番号
  objHttpReq.setRequestHeader "Host", "localhost" + ":8921"
  'キャッシュ対策(常にレスポンスが取得できる状態にする)
  objHttpReq.setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT"
  'REST API Version
  objHttpReq.setRequestHeader "X-Wagby-RESTAPIVersion", "v2"
  '------------------------------------------------------------------
  ' リクエストを送信する
  '------------------------------------------------------------------
  objHttpReq.send (Null)
  '------------------------------------------------------------------
  ' レスポンスを取得する
  '------------------------------------------------------------------
  'レスポンス情報を変数に格納する
  strJSON = objHttpReq.responseText
  'MsgBox (strJSON)
    'レスポンスで取得したJSONをパース
    Set objJSON = parseJSON(strJSON)
  If IsNull(objJSON.Item("entity")) Then
    Range("C4").value = "No data."
    Range("C5").ClearContents
    Range("C6").ClearContents
    Range("C7").ClearContents
  Else
    'Call DumpJSONObj(objJSON)
    '取得したレコードからフィールドの値を取得
    Dim entity As Object
    Set entity = objJSON.Item("entity")
    Debug.Print entity.Item("customerid") & vbCrLf;
    Debug.Print entity.Item("customername") & vbCrLf;
    Debug.Print entity.Item("customerkana") & vbCrLf;
    Debug.Print entity.Item("companyname") & vbCrLf;
    Debug.Print entity.Item("tel_") & vbCrLf;
    Range("C4").value = entity.Item("customername")
    Range("C5").value = entity.Item("customerkana")
    Range("C6").value = entity.Item("companyname")
    Range("C7").value = entity.Item("tel")
  End If
End Sub
Sub clear()
  Range("C2").ClearContents
  Range("C4").ClearContents
  Range("C5").ClearContents
  Range("C6").ClearContents
  Range("C7").ClearContents
  Range("C2").Activate
End Sub
'--------------------------------------
'JSONをパースしたオブジェクトを生成
'--------------------------------------
Public Function parseJSON(strJSON As String) As Object
  Dim lib As New JSONLib 'Instantiate JSON class object
  '------------------------------------------------------------------
  ' パースした内容を objJSON 変数に格納する
  '------------------------------------------------------------------
  Set parseJSON = lib.parse(CStr(strJSON))
End Function
Private Sub DumpJSONObj(ByRef json As Variant)
    If TypeName(json) = "Dictionary" Then
        Call DumpDictionaly(json)
    ElseIf TypeName(json) = "Collection" Then
        Call DumpCollection(json)
    Else
        Debug.Print "value:" & json
    End If
End Sub
Public Sub DumpCollection(ByRef dic As Variant)
    Dim keys
    Dim i
    For i = 0 To dic.Count - 1
        Debug.Print "ArrayNo:" & i
        Call DumpJSONObj(dic.Item(i + 1))
    Next i
End Sub
Public Sub DumpDictionaly(ByRef dic As Variant)
    Dim keys
    Dim i
    keys = dic.keys
    For i = 0 To dic.Count - 1
        Dim key
        key = keys(i)
        Debug.Print "key:" & key
        Call DumpJSONObj(dic.Item(key))
    Next i
End Sub
  • 13行目の strURL 変数に、対象となるWagbyアプリケーションの接続先URLを記載します。ここでは同一マシンで起動されたものとしています。
  • C2セルには「顧客ID」が格納されているとします。REST API 利用時は主キーを指定して操作するためです。
  • 24行目にログオン情報を用意しています。X-Wagby-Authorizationという名前で、ログオンIDとパスワードのペア (この例では "admin:wagby")をBASE64で符号化した情報を設定しています。
  • 28行目のキャッシュ対策も忘れずに行ってください。常に最新の情報を取得するようにします。
  • 30行目で REST API のバージョンを指定しています。
  • 35行目でWagbyに接続します。このとき、Wagby内部ではログオン処理と、REST API の処理(ここでは1件のデータの返戻)が行われます。
  • 41行目で、返戻値をJSON文字列として取得します。42行目はデバッグ用です。コメントアウトをはずすと、実際のJSON文字列をメッセージボックスで確認できます。
  • 44行目で、JSON文字列をオブジェクトに変換しています。以降は、オブジェクトに含まれている値を、セルに埋め込んでいます。
  • 82行目に、JSON文字列をオブジェクトに変換するパース処理が記述されています。実際には JSONLib というライブラリの機能を使っています。
  • 52行目の DumpJSONObj 関数を有効にすると、JSONオブジェクトの内容を確認できます。

ポイントは JSONLib というライブラリを使っていることです。JSONLib はオープンソースで提供されています。
https://code.google.com/p/vba-json/

ダウンロード

ここで紹介したリポジトリ、サンプルデータ、サンプルアプリケーション(Excelファイル)一式をダウンロードできます。

お試しの前に

ダウンロードしたプログラム (Excelマクロ) はログオンアカウント admin (パスワードはwagby) で接続するようになっています。

ワンポイント

JSONLib を利用するためには、対象の Excel に jsonlib クラスモジュールをインポートする必要があります。 当ページでダウンロードできる Excel ファイルは既にインポート済みですので、こちらを編集する形での開発をお勧めします。

セキュリティについての考慮点

「REST API 活用ガイド > ログオン・ログオフ > 自動ログオン > セキュリティ」をお読みください。