HTTPサーバーとWeb開発

21. CGI とは ?

CGI (Common Gateway Interface) とは HTML からの入力を読み込んで結果としての次に表示すべきHTML を出力するプログラムのことである。iSeries400のユーザーは CGI とは HTML という DSPF を読み込んで次の HTML という DSPF を出力する対話型のプログラムであると理解するとそれは少し正しくない。

CGI の処理は HTML を出力してしまえばそれで終了する。HTTPサーバーは多くのユーザーからのアクセスを前提としているためCGI からのHTML出力をクライアントに送信すると、それでクライアントとの通信を終わってしまうからである。
このようにしておかないとHTTPサーバーはいつまでもクライアントからの応答を待ち続けることになってしまい、リソースを多大に消費するからである。よって CGI の仕事もHTMLを出力してそれで終了ということになる。

次に iSeries400における CGI の一般的な処理の流れを示す。

  1. メソッドが GET か POST であるかを判断する。
  2. メソッドに応じてHTMLからのユーザーの入力値を受け取る。
  3. PARSE (入力値を分割する。)
  4. デコード(コード化されている入力値を元の値に戻す)
  5. 内部処理(データベースのアクセスなど)
  6. 結果としての次に表示するHTMLを表示する。
【 補足説明】

HTMLからのユーザーが入力した値は

FLD001=1101%B1&FLD002=1203%8E

のように FLD001=(フィールド FLD001の値) & FLD002=(FLD002の値) として & で結合されている。これらを分割することを PARSE と呼ぶ。
また %B1 などのようにコードの一部はWebブラウザによってコード化(エンコード)されて送られてくるので これを元のコードに戻す必要がある。このことをデコードと呼ぶ。

PARSE も デコードも iSeries400 では API が提供されているのでそれを使用すること。特に デコードを自分で行うことは CGI の品質からいっても避けたほうが賢明である。

CGI では入力を特に 標準入力と呼び、出力を標準出力として処理する。これは C言語の StdIn、 StdOut に相当する。

また iSeries400 で扱う CGI で注意しておきたいのが HTML からの入力フィールド名は、処理する DB2/400データベースに登録されているデータベースのフィールド名と同じ名前のフィールド名を使用すべきであるということである。
実はこのようにしておくと CGI の内部処理では QtmhCvtDb という API によってデータベースのフィールドに対応させて正しいレコード・バッファーを作成することが容易になるからである。このことによりレコードの更新処理が安定することになる。