2019年6月29日土曜日

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

前のエントリでは NotesHTTPRequest の get メソッドを実行し、その戻り値を NotesJSONNavigator クラスへ直接セットしたとき Type mismatch とメッセージが表示されることがあり、そうなる場合の可能性として
  • Content-Type が application/json ではなく text/plain であること
を指摘しました。

その点について、今回は node.js を使って検証してみようと思います。

node.js とは JavaScript の実行環境です。非常に簡単に web アプリを実装できます(レベル感はそれぞれと思いますが)。
私は自宅の Windows 10 に node.js をインストールしており、近い将来 AppDev pack について学習する準備を整えようとしていて、一冊の node.js の入門書を終えたところです。

ですので node.js とその周辺技術についてはほぼほぼ初心者であることを予めお伝えします。また express のインストールなど詳細は省きます。ボロがでますので。

今回、検証用に用意した node.js  側のアプリ app.js のコードは次のとおりです。
const app = require('express')();
const http = require('http').Server(app);

http.listen(3000, () => console.log('Server started'))

app.get('/', function(req, res) {
    var content = [{
        "short": "下丸子図書館 ",
        "address": "東京都大田区下丸子二丁目18番11号",
    }];

    // パターン1:JSONを文字列に変換
    res.json(content);

    // パターン2:Content-Type が application/json
    //res.writeHead(200, {'Content-Type': 'application/json; charset=utf-8'});
    //res.write(JSON.stringify(content));
    //res.end()

    // パターン3:Content-Type が text/plain
    //res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'});
    //res.write(JSON.stringify(content));
    //res.end()
})

自宅のパソコンに Notes クライアントと node.js を同居させています。
app.js の実行中に、localhost のポート 3000 番にアクセスすると JSON (あるいはそれっぽいもの)を返します。

JSON のデータは変数 content にある JSON 文字列を元に3パターン用意しています。パターンの切替は、コードの行頭にある // の削除、あるいは行頭へ // を追加しています。
  1. JSONを文字列に変換して返す
  2. JSONを文字列に変換して Content-Type に application/json を指定して返す
  3. JSONを文字列に変換して Content-Type に text/plain を指定して返す


そしてNotesクライアントで実行するエージェントは、前回使用したコードの "url =" の部分を "http://localhost:3000" に書き換えたものになります。


さて結論から言うと、この3つのパターンのうち3番目だけ Type mismatch が発生しました。

パターン1 には Content-Type を指定していませんが、Notes クライアントでレスポンスヘッダーを見ると application/json になっていました。

つまり、パターン1とパターン2のように、レスポンスヘッダーの Content-Type が application/json の場合、Type mismatch とならなかったことがわかりました。

なお文字列中の改行については、パターン2とパターン3で JSON.stringify(content, null, 2) として改行を含んだ文字列にしましたがが、結果に変化はみられませんでした。

もし、NotesHTTPRequest の get メソッドで Type mismatch となった場合、レスポンスヘッダーにある Content-Type を確認してみてはいかがでしょうか。

0 件のコメント:

コメントを投稿