2023/07/01

Project KEEP 体験:#6)郵便番号検索 - ノーツから検索!?

Web アプリ素人が Domino 12.0.2 の新機能である Domino REST API(Project KEEP)を怖いもの見たさで触ってみた体験レポートの最終回です。

前回、Domino REST API 経由で、自作の DB が API として公開できました。今回は、その API を利用するアプリを作って、テストをしたいと思います。

アプリケーションを作成するプラットフォームは、もちろん(?)ノーツです。ノーツクライアントから HTTP リクエストを発行させ、Domino REST API 経由で、郵便番号マスタを検索、ヒットした文書を JSON で取得するという、ムダだらけの回りくどいアプリです(笑)

私に WEB アプリを作る技術がないので、こうなってしまいました。ご容赦ください...


サンプルアプリ

まずは、作成したサンプルアプリの紹介です。

フォームを開くと、ユーザ名とパスワード、検索する郵便番号を入力します。[API 実行] ボタンをクリックすると、フォーム内の URL や スコープ名を使用して、Domino REST API に接続、郵便番号を検索し、住所を含む JSON を返します。API からの結果はフォームのボタンから下のエリアに表示します。

ボタンの動作は大きく2つに分かれます。それぞれ順に説明します。

① 認証トークンの取得

② 郵便番号の検索


① 認証トークンの取得

まず、Swagger UI で認証トークンの取得(/auth)を実行してみましょう。Responses の Snippets を確認すると、次のように表示されています。

ここに、今回のリクエストの curl のコマンドが表示されています。ここから、次のことが具体的に読み取ることができます。

  • リクエストの URL
  • HTTP リクエストのメソッドは POST
  • HTTP ヘッダは accept と Content-Type の2種
  • 送信するデータ(Request body)

この情報を使って、リクエストの LotusScript を記述します。


まず、HTTP Request のオブジェクトを準備します。

Dim ns As New NotesSession Dim http As NotesHTTPRequest
Set http = ns.CreateHTTPRequest()

続いて、2つの HTTP ヘッダーを設定します。

Call http.SetHeaderField("Content-Type", "application/json")
Call http.SetHeaderField("accept", "application/json")


次に、Request body として送信する JSON を準備します。NotesJSONNavigator クラスのオブジェクトを作成し、AppendElement メソッドで JSON の中身を追加します。なお、nd は現在編集中の文書で、そこからユーザ名とパスワードを取得しています。

Dim jnav As NotesJSONNavigator
Set jnav = ns.CreateJSONNavigator("")
Call jnav.AppendElement(nd.Password(0), "password")
Call jnav.AppendElement(nd.UserName(0), "username")


準備ができたら、Post メソッドでリクエストを送信します。事前に準備した Request body の JSON を Stringify プロパティでテキスト文字列に変換して引数にセットします。なお、送信前に、PreferJSONNavigator プロパティを使用して、戻り値を NotesJSONNavigator のオブジェクトで返すよう指定しておきます。

http.PreferJSONNavigator = True
Set jnav = http.Post(nd.URL_Auth(0), jnav.Stringify)


結果は次のような JSON でした。認証トークンは、最初の項目にありますね。

認証トークンの取得は、結果の JSON を GetElementByName で検索して取得します。実際の認証トークンの文字列は、JSON エレメントの Value プロパティで取得します。

次のコードでは、取得した認証トークンを Bearer というフィールドにセットしています。

Set jelm = jnav.GetElementByName("bearer")
Call nd.ReplaceItemValue("Bearer", jelm.Value)


これで、認証トークンの取得は完了です。


② 郵便番号の検索

認証トークンが準備できたので、いよいよ、郵便番号の検索です。例によって、Swagger UI の 検索(/query)の Snippets を確認します。

この画面からリクエストの仕方を確認しましょう。認証トークンの取得と違う部分は次の2点です。

まずは、HTTP ヘッダです。今回は、Authorization が追加されています。このキーの値は、認証トークンの文字列の前に "Bearer " という文字列を付加して設定されています。

Request URL では、エントリポイントである URL の後ろに文字列が追加されています。この "?" 以降の部分がパラメータです。

http://localhost:8880/api/v1/query?dataSource=zipscope&action=execute

必須項目であった2つのパラメータが指定されています。フォーマットは、パラメータ名と値を "=" でつなぎ、複数のパラメータをつなぐには "&" を使用します。


サンプルアプリの詳細

今回のサンプルアプリの全体をまとめてご紹介します。まずは、フォームイメージです。[API 実行] ボタンのコードのフィールド名を確認する際に参考にしてください。

続いて、[API 実行] ボタンのコードです。前段でかいつまんで紹介したコードや省略した部分、変数宣言を含め、すべてのコードを掲載します。

Sub Click(Source As Button)
Dim ns As New NotesSession
   Dim nuiw As New NotesUIWorkspace
   Dim nuid As NotesUIDocument
   Dim nd As NotesDocument

   Dim sURL As String
   Dim http As NotesHTTPRequest
   Dim jnav As NotesJSONNavigator
   Dim jelm As NotesJSONElement

   Set nuid = nuiw.CurrentDocument
   Set nd = nuid.Document

   '① 認証取得
   '---------------------------
   'HTTP リクエストの準備
   Set http = ns.CreateHTTPRequest()
  
   'HTTP ヘッダーの設定
   Call http.SetHeaderField("Content-Type", "application/json")
   Call http.SetHeaderField("accept", "application/json")

   'RequestBody の準備
   Set jnav = ns.CreateJSONNavigator("")
   Call jnav.AppendElement(nd.Password(0), "password")
   Call jnav.AppendElement(nd.UserName(0), "username")

   '② リクエスト実行
   http.PreferJSONNavigator = True
   Set jnav = http.Post(nd.URL_Auth(0), jnav.Stringify)
   Set jelm = jnav.GetElementByName("bearer")
   Call nd.ReplaceItemValue("Bearer", jelm.Value)

   '郵便番号検索
   '---------------------------
   'HTTP リクエストの準備
   Set http = ns.CreateHTTPRequest()

   'HTTP ヘッダーの設定
   Call http.SetHeaderField("Content-Type", "application/json")
   Call http.SetHeaderField("accept", "application/json")
   Call http.SetHeaderField("Authorization", "Bearer " & nd.Bearer(0))

   'RequestBody(JSON) の準備
   Set jnav = ns.CreateJSONNavigator("")
   Call jnav.AppendElement("default", "mode")
   Call jnav.AppendElement("form = 'zip' and zipcode = '" & nd.ZipCode(0) & "'", "query")
   Call nd.ReplaceItemValue("RequestBody", jnav.Stringify)

   'URL & パラメータ
   sURL = nd.URL(0)
   sURL = sURL & "?dataSource=" & nd.ScopeName(0) & "&action=execute"
   Call nd.ReplaceItemValue("RequestURL", sURL)

   '検索実行
   http.PreferJSONNavigator = True
   Set jnav = http.Post(sURL, jnav.Stringify)
   Call nd.ReplaceItemValue("ReturnText", jnav.Stringify)
End Sub


おわりに

以上で、Project KEEP 体験 シリーズは終了です。

なお、このシリーズは、Web アプリ素人が勉強がてら Project KEEP を触ってみた作業をまとめたものです。このような背景から、誤解や不正確な情報などが含まれている可能性があります。予めご了承の上ご一読ください。

こんな記事でも、何かの役に立てば幸いです。

前回 Project KEEP 体験

0 件のコメント:

コメントを投稿