なぜか、シリーズ化してしまった、「画面定義をHTMLで行い、呼び出しをWebAPIでやる設計手順の試案」です。
やろうとしてるのは、
・HTMLで画面を作成し、
・AJAXでサーバ呼び出し、結果はXMLで受け取ったものを利用して
→Javascriptでその画面に結果を出力したり
→次画面をだして出力したり。。
・そーすると、画面とサーバーが完全に分離する
という話と同時に、画面から、逆にさかのぼって要求仕様にまでもっていける。そうすると、COBOLのシステムをWebに置き換えたいけど、ドキュメントもソースも無いときなんかに、利用できるっていう話
■いままできたところ
で、今までの話で、
(1)画面をHTMLで作成する(ここがスタート)
(2)アクションなど、イベントを拾うところで、
onイベント=ファンクション
として、とにかく、ファンクションをfunctionでつくってしまう
(3)作った関数について
サーバーアクセスするものは、関数の中に
sv_access(呼び出し元、呼び出したいサーバーアプリ,"")
みたいなかんじで、ダミー関数を書く
(4)grepで、(3)のダミー関数(sv_access)を、一覧で取得
(5)検索した内容をファイルに保存し、Excelで読み込み、
WebAPIのサービス一覧を取得する
(6)でてきた呼び出したいサーバーアプリ=サービスを、
1サービス1シートで、Excelシートにまとめる。
ところまできました。
■今日の内容
今日は、
(7)クライアント側の画面と、サーバー側を完全に分離するためのダミーCGIを入れます。
・まず、返すXMLを作成します
・ダミーCGIを作成します
という作業をします。
これを入れると、クライアントはクライアントで、サーバーはサーバーで、完全に分離して勝手に作業ができます。(さっきの、「逆にさかのぼって要求仕様にまでもっていける」という話は、このあとの作業になります。それは、次回の範囲です。)
■分離用CGIのつくりかた(1:返すXMLを作成)
前のところで、こんなWebAPI定義をかきました。

で、その結果、返る値は、
<?xml version="1.0" encoding="UTF-8"?> <result> <code>0</code> </result> |
(上記< > は本当は半角)
のようなかんじになると書きました。
そこで、上記の内容を、ファイルに保存して、次に書く文利用CGIからみえる、適当なところに保存します。
■分離用CGIのつくりかた(2:ダミーCGI)
で、アクセスする関数は、サーバーのCGIのURLがhttp://127.0.0.1/cgi-bin/とすると、
http://127.0.0.1/cgi-bin/alltest.cgi?user=user1
のようになるとかきました。
ここで、そのCGI置き場(CGI-BIN)にある、WebAPI名のCGI(例だとalltest.cgi)を、以下の、上記XMLを返すだけのダミー関数にします。
#!C:/Perl/bin/perl use CGI; ################################# # 宣言 # ################################# # # 以下のalltest.xmlを、毎回、送り返したいファイルに # かきかえること # $sendfname = "alltest.xml"; # 送り返す内容のファイル ################################# # 必要な変数の取得 # ################################# ##引数を取得 if ( $ENV{'REQUEST_METHOD'} eq "POST" ) { read (STDIN, $qs, $ENV{'CONTENT_LENGTH'}); } else { $qs = $ENV{'QUERY_STRING'}; } @qs = split(/&/,$qs); foreach $i (0 .. $#qs) { ($name, $value) = split(/=/,$qs[$i],2); $value =~ tr/+/ /; #“+”を空白 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # %XX変換 $qs{$name} = $value; } ################################# # ファイル読み込み # ################################# if ( -e $sendfname ) { $flen = -s $sendfname; # ファイルサイズ取得 open (IN, $sendfname); read (IN, $send, $flen); close(IN); } else { $send = ""; } ################################# # 出力 # ################################# #見出しの表示 print "Content-Type: text/xml¥n¥n"; print $send; |
(上記< > ¥ は本当は半角)
こうすると、上記のURLでクライアントから呼び出すと、上で書いた返すXMLが返ってくるので、これをもとに、画面部分のプログラムを書いて、単体テストすることができます。
というところで、今日はおしまい。