ブラウザとサーバーをJSONで連絡
投稿:2018-03-01
このサービスを作っていて簡単な連絡方法を模索してた。
ボーカロイド楽曲検索サービス - サービス - ルモーリン
ソースを上から順に説明していくと、
- リクエストオブジェクトを作り
- URLを用意して
- 第3パラメタで非同期を指定して初期化して
- ブラウザがキャッシュせずにサーバーへ投げるようにして
- JSONを投げる事を指定して
- 応答に対する以下の挙動をリスナで用意して
- 応答が200(正常)のときに
- 応答をJSON文字列としてパース、オブジェクトにして
- オブジェクトから欲しい情報を取得して
- リクエストオブジェクトを削除して応答の挙動終了
- ここで初めてオブジェクトを変換したJSON文字列をサーバーへ送信
var xhr = new XMLHttpRequest();
var url = "https://www.?????.jp/cgi-bin/?????.cgi";
xhr.open("POST", url, true);
xhr.setRequestHeader("Cache-Control", "no-cache");
xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
xhr.addEventListener("load", function (ev) {
if (200 == ev.target.status) {
var res = JSON.parse(xhr.responseText);
/* 省略、サーバーが返したres.resultとか参照可 */
}
delete xhr;
});
xhr.send(JSON.stringify({
"function": "summary",
}));
こちらは簡単で、受け取ったJSON文字列をハッシュリファレンスにした後、中身を見て処理します。
最後に結果のハッシュリファレンスをJSON文字列に変換して返します。
この返した奴がブラウザのJavaScript(リスナ)に届く訳です。
#!/usr/bin/perl -w
use utf8;
use strict;
use warnings;
use open IO => ":utf8";
use CGI '-utf8';
use DBI;
use Encode::Locale;
use Encode;
use JSON;
$| = 1;
my $cgi = new CGI;
my $param = decode_json scalar $cgi->param("POSTDATA");
my $result;
if (defined $param && exists $param->{function}) {
if ("search" eq $param->{function}) {
$result = search($param);
} elsif ("summary" eq $param->{function}) {
$result = summary($param);
} else {
$result = {
result => "invalid function",
};
}
}
print "Access-Control-Allow-Origin: www.lemorin.jp\r\n";
print "Content-type: application/json; charset=utf-8\r\n";
print "\r\n";
print encode_json $result;
exit;
