目次


連載 Domino V10 アプリ開発 #鬼わか 解説

第 6 回「NotesからREST APIを呼んで郵便番号検索をしてみよう #鬼わか 解説」

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: 連載 Domino V10 アプリ開発 #鬼わか 解説

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:連載 Domino V10 アプリ開発 #鬼わか 解説

このシリーズの続きに乞うご期待。

1

はじめに

連載 「Domino V10 アプリ開発 #鬼わか 解説」のページにアクセスいただき、ありがとうございます。

前回は、LotusScript で DQL を使用して Domino のデータにアクセスしてみました。

今回は、Domino V10 で新たに追加された LotusScript での HTTP リクエストについてご紹介します。

サンプルとして、IBM Notes/Domino アプリケーションから郵便番号検索サイトの REST API を呼び出し、 郵便番号をキーにして住所の情報を取得する例を示します。

また、今回は API の利用において、認証は不要になっています。

ご紹介する内容は以下の図のようになります。

 

2

郵便番号を検索してみよう

まず、郵便番号検索サイトに Web ブラウザーのアドレスバーから API に対して GET リクエストを投げて検索してみます。

ベースとなる URL は、「http://zipcloud.ibsnet.co.jp/api/search」です。そこに郵便番号「8480001」をパラメーターとして付けて GET リクエストを実施する場合、下記の URL へのアクセスになります。

http://zipcloud.ibsnet.co.jp/api/search?zipcode=8480001

実際に、Web ブラウザーのアドレスバーに URL を打ち込んでみると、下記のレスポンスが JSON 形式で Web ブラウザーに表示され、郵便番号がどの住所に該当するか結果が表示されました。

 

次に、この郵便番号 API リクエストを、Notes アプリケーションの中に組み込まれていく様子を見てみましょう。

Notes アプリケーションのフォームを開き、検索したい郵便番号を入力し「検索」ボタンをクリックします。

 

検索結果の JSON が整形され、住所フィールドにセットされたのが分かります。

 

このフォームから、どのような仕組みで郵便番号 API を呼び出しているのか解説していきます。

3

NotesHTTPRequest を呼んでみよう

サンプルで下図のようなフォームを作成してみます。

 

「検索!」ボタンを押すと、InputCode フィールドの郵便番号を API に渡し、その結果を OutputText に表示するように設定します。

「検索!」ボタンのスクリプトエリアに以下の LotusScript を記述します。

Sub Click(Source As Button)
    Dim ws As New NotesUIWorkspace
    Dim uidoc As NotesUIDocument
    Dim session As New NotesSession
    
    Dim http As NotesHTTPRequest
    
    Dim textResult As String
    Dim url As String
    Dim returnValue As Variant

  ' "InputCode"フィールドの値を取得して、リクエストURIを生成
    Set uidoc = ws.CurrentDocument
    textCode = uidoc.FieldGetText("InputCode")
    
    url = "http://zipcloud.ibsnet.co.jp/api/search?zipcode="
    url = url + textCode

  ' Getリクエストを実行し、結果を取得
    Set http = session.CreateHTTPRequest()    
    returnValue = http.Get(url)
    textResult = returnValue
    
  ' "OutputText"フィールドに結果を格納して画面をリフレッシュ
    Call uidoc.FieldSetText("OutputText", textResult)
    Call uidoc.Refresh()
End Sub

Notes クライアントで作成したフォームを開き、実存する郵便番号を入力して「検索!」を実行すると、下図のような JSON 形式のテキストが、結果フィールドに表示されます。

 

4

JSON をパースしてみよう

第 3 章では NotesHTTPRequest クラスを利用して、外部アプリケーションから HTTP 経由で実行結果を得られることを確認しました。その実行結果は外部アプリケーションによってレスポンスは異なるのですが、今回の例では JSON 形式でレスポンスが得られます。IBM Notes/Domino V10 では HTTP リクエストを扱う NotesHTTPRequest クラスに追加して、JSON のデータを取り扱い安くするための JSON パーサーの機能も追加されています。具体的には、NotesJSONArray、NotesJSONElement、NotesJSONNavigato、NotesJSONObject の 4 つのクラスが新たなに追加されています。

具体的にこれらのクラスを利用して、JSON データをパースし、必要なデータのみをどのように抽出するのかを見ていきましょう。

<第 3 章と同様>
    
    returnValue = http.Get(url)
    textResult = ""
    
    'JSON パース
    Dim jsonNav As NotesJSONNavigator
    Dim jsonElement As NotesJSONElement
    Dim jsonElement2 As NotesJSONElement
    Dim jsonElement3 As NotesJSONElement
    Dim jsonArray As NotesJSONArray
    Dim jsonArrElem As NotesJSONElement
    Dim jsonObj As NotesJSONObject
    
    ' 返ってきたJSONに改行コードが入っていれば消去する
    json = Replace(Replace(returnValue, Chr(13), ""),Chr(10),"")
    
    ' JSON データを JsonNevigator 型にデータにセットする
    Set jsonNav = session.CreateJSONNavigator(json)
    
    ' status のデータを取得しエラー判定を行う
    Set jsonElement = jsonNav.GetElementByPointer("/status")
    
    If jsonElement.Value = "200" Then
        ' 検索結果が resul に格納されているので、それを JsonElement 型にセットする
        Set jsonElement2 = jsonNav.GetElementByName("results")
        ' 検索結果が存在しない(ブランク)の場合
        If jsonElement2.Type = 64 Then
            textResult = "Error: No Result"
       ‘ 検索結果が存在した場合、JSON の各要素を取得 
   Else
            Set jsonArray = jsonElement2.Value
            Set jsonArrElem = jsonArray.GetFirstElement
            
            Dim addr1 As String
            Dim addr2 As String
            Dim addr3 As String
            
            Dim tmpResult As String
            While Not(jsonArrElem Is Nothing)
                Set jsonObj = jsonArrElem.Value
                Set jsonElement3 = jsonObj.GetFirstElement()
                While Not(jsonElement3 Is Nothing)
                    If (jsonElement3.Name = "address1") Then
                        addr1 = jsonElement3.Value
                    End If
                    If (jsonElement3.Name = "address2") Then
                        addr2 = jsonElement3.Value
                    End If
                    If (jsonElement3.Name = "address3") Then
                        addr3 = jsonElement3.Value
                    End If
                    tmpResult =  "住所:  " + addr1 + addr2 + addr3
                    Set jsonElement3 = jsonObj.GetNextElement()
                Wend
                If textResult = "" Then
                    textResult = tmpResult 
                Else
                    textResult = textResult + Chr(10) + tmpResult
                End If
                Set jsonArrElem = jsonArray.GetNextElement()
            Wend
        End If
    Else
        textResult =  jsonNav.GetElementByPointer("/message").value
    End If
    
    Call uidoc.FieldSetText("OutputText", textResult)
    Call uidoc.Refresh()

いかがでしょうか?LotusScript を利用して外部サービスを呼び出し、実行結果が JSON 形式で返される場合には、LotusScript で JSON データをパースして必要なデータのみを素早く取り出せることをご理解いただけたかと思います。

5

おわりに

今回は、LotusScript から外部の REST API を呼び、結果の JSON 形式データを処理する方法を解説しました。皆様もぜひお試しください。

次回は、認証が必要な外部のアプリケーションからデータを取得する方法を解説します。

お楽しみに!


ダウンロード可能なリソース


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Lotus
ArticleID=1065681
ArticleTitle=連載 Domino V10 アプリ開発 #鬼わか 解説: 第 6 回「NotesからREST APIを呼んで郵便番号検索をしてみよう #鬼わか 解説」
publish-date=04252019