2019年6月29日土曜日

NotesHTTPRequest の get メソッドで Type mismatch(前編)

10.0.1 の FP2 で拡張された NotesHTTPRequest のプロパティと NotesJSONNavigator を試しました。

概要は、次の Technical Blog Post にあります。
Limitations of NotesHTTPRequest and NotesJSONNavigator with future considerations

FP2 では NotesHTTPRequest に新たに2つのプロパティ(PreferUTF8 と PreferJSONNavigator)を含むのだとか。

ありがたいことに、私が使用する Community 版にも FP2 が提供されていますので適用してみたところ、Designer でコードをタイピングしたときに追加されたプロパティも表示されることを確認できました。


これらのプロパティについて2019年6月末時点では Knowledecenter を検索してもヒットしませんし、上の画像のように説明もほぼありません。 詳しいことは分かりませんが、さっそく試してみることにします。

先の Technical Blog Post には、FP2より前とFP2のコードが紹介されており、 NotesHTTPRequest の戻り値から直接 NotesJSONNavigator クラスのインスタンスを作るには、事前に PreferJSONNavigator プロパティに 1 をセットしておく、と読めます。

そこで、次の鬼わかの記事でも利用している郵便番号検索サイトで試してみました。

連載 Domino V10 アプリ開発 #鬼わか 解説
第 6 回「NotesからREST APIを呼んで郵便番号検索をしてみよう #鬼わか 解説」

試したエージェントのコードは次のとおりです。
Option Public
Option Declare

Dim ss As NotesSession
Sub Initialize
 Dim jsonNav As NotesJSONNavigator
 Dim url$
 Set ss = New NotesSession
 url = "http://zipcloud.ibsnet.co.jp/api/search?zipcode=8480001"
 Set jsonNav = getJSON(url)
End Sub
Function getJSON(url$) As NotesJSONNavigator
 Dim http As NotesHTTPRequest
 Set http = ss.CreateHTTPRequest()

 http.Preferjsonnavigator = True
 Set getJSON = http.Get(url)
End Function

エージェントを実行すると、下から2行目で Type mismatch と出ます。


上のデバッグ・ウィンドウをよく見ると、レスポンスコードが 200 となっているので、検索結果は戻ってきているようです。ただし NotesJSONNavigator のインスタンスが作れていません。

ひょっとして body が JSON 形式じゃないのかも?

と考え、 notes.ini へ次の1行を追加して、console.log に記録されるデバッグ情報をみてみることにしました。

DEBUG_NOTESHTTPREQUEST=1 

すると、気になる点が2つありました。まず、レスポンスヘッダーの Content-Type が application/json ではなく text/plain でした。

LSXBE HTTP debug information type: HTTP Response header:
Content-Type: text/plain;charset=utf-8

もうひとつは data に改行が含まれていることです。

LSXBE HTTP debug information type: HTTP Response header:  
 Content-Type: text/plain;charset=utf-8
 
LSXBE HTTP debug information type: HTTP Response data:  
 "message": null,
 "results": [
  {
   "address1": "o¢ET│Ct£i",
   "address2": "o-eoccUciOce",
   "address3": "Oiuμ│oOnUto-UciμRi",
   "kana1": "´¢-´¢A´\×´¢-´\O",
   "kana2": "´¢-´\A´\y´¢-",
   "kana3": "´\E´\a´\E´\e´\C´\u´¢≪´¢│´¢-´\×´¢!´¢│´\e´\×´¢-",

ひょっとするとこれらが type mismatch の原因なのかも。


そこで、郵便番号検索とは別のサービス、カーリルさんの図書館APIを試してみることに。
上のコードの "url = " で渡す値を次のように書き換えます。

"http://api.calil.jp/library?appkey=[あなたのアプリキー]&city=大田区&format=json&callback="
※実際のコードへ設定する場合、アプリキーと、"大田区"の文字列はURLエンコードが必要です

実行してみたところ、エラーにならず NotesJSONNavigator クラスのインスタンスが作成できました。


このときのデバッグ情報は、レスポンスヘッダーの Content-Type は application/json であることに加え、data は 2つにわかれてはいるものの改行は含まれていないように見えました。

LSXBE HTTP debug information type: HTTP Response header:  
 Content-Type: application/json; charset=utf-8

LSXBE HTTP debug information type: HTTP Response data:  
[{"category": "MEDIUM", "city": "Onoto-Oi-", "short": "ocioccO!EOo│μocUn- ", "tel": "03-3759-2454", "pref": "μO-o--Ua¢", "faid": null, "geocode": "139.6880403,35.5658561", "systemid": "Tokyo_Ota", "address": "μO-o--Ua¢Onoto-Oi-ocioccO!Eo-iocuto≪18to¬11OAA
LSXBE HTTP debug information type: HTTP Response data:  
to¬14OAA Onoμu≪TncOEeμu¢T-!OaoOa-LuzOnoμu≪Oaa", "libid": "109666", "libkey": "OaNμu-o-oOo│μocUn-", "post": "143-0016", "url_pc": "http://www.lib.city.ota.tokyo.jp/", "systemname": "μO-o--Ua¢Onoto-Oi-", "isil": "JP-1000983", "formal": "Onoto-Oi-t-iOaNμu-o-

これだけでは断定できませんが、可能性のひとつかもしれません。

次のエントリでは、 node.js を使って検証してみようと思います。

0 件のコメント:

コメントを投稿