Flash 側のデータ送受信処理について
■Flash 側のデータ送受信処理について
「Flash と CGI の連携」において、 Flash 側で可能な処理として、以下の方法があります。
■navigateToURL() メソッドを使用する
navigateToURL() メソッドを使用すると、CGI にデータを送信しつつ、ブラウザで CGI のページを開くことができます。
navigateToURL(URLRequestオブジェクト,ターゲットウィンドウ名);
| 第01引数 | URLRequest オブジェクトを指定 |
| 第02引数(略可) | ターゲットウィンドウ名を指定、"_blank" など |
| 戻り値 | なし |
■第01引数 URLRequest オブジェクトを指定
URLRequest クラスについては次の項目で解説しています。
■第02引数 ターゲットウィンドウ名を指定
ブラウザで開くターゲットウィンドウ名を指定します。名前以外に以下の文字を指定することもできます。
| 文字列 | 説明 |
| _self | 現在のウィンドウ |
| _blank | 新規にウィンドウを開く |
| _parent | 現在のウィンドウから1つ上(親)のウィンドウ |
| _top | 現在のウィンドウの最上位(ルート)のウィンドウ |
■URLRequest クラスについて
URLRequest クラスを使って、「送信先のURL」 と 「HTTP メソッド」と「送信データ」を指定します。
■URLRequest オブジェクトを作成する
URLRequest クラスをインスタンス化して、 URLRequest オブジェクトを作成します。
引数に、CGI までの URL か相対パスを指定します。
URLRequest オブジェクトを作成する
// CGI ページの URL
var url:String = "http://hakuhin.jp/test.cgi";
var url_request:URLRequest = new URLRequest(url);
インスタンス化した後で、url プロパティからセットすることもできます。
URLRequest オブジェクトを作成して url を指定する
// CGI ページの URL
var url:String = "http://hakuhin.jp/test.cgi";
var url_request:URLRequest = new URLRequest();
url_request.url = url;
■HTTP メソッドを指定する
HTTP メソッドを指定するには、method プロパティに以下の定数をセットします。
デフォルトは、URLRequestMethod.GET です。
| 定数 | 説明 |
| URLRequestMethod.GET | GET メソッドを使用する |
| URLRequestMethod.POST | POST メソッドを使用する |
GET メソッドは、URL 文字列にパラメータを付加する事で情報を送ります。送信できるサイズに限界があるので、パラメータの総量が少ない時に利用します。
POST メソッドは、大容量のデータを送る事ができます。
なお POST メソッドは、ローカル環境では動作しないようです。
HTTP メソッドを指定する
// CGI ページの URL
var url:String = "http://hakuhin.jp/test.cgi";
var url_request:URLRequest = new URLRequest(url);
url_request.method = URLRequestMethod.GET;
■送信データについて
■URLVariables オブジェクトを作成する
CGI に送信したいデータがある場合、URLVariables クラスを使用します。
URLVariables クラスは、データを格納するための入れ物として使用します。まずはインスタンス化して URLVariables オブジェクトを作成します。
URLVariables オブジェクトを作成する
var url_var:URLVariables = new URLVariables();
■送信データを格納する
URLVariables オブジェクトは、Object のように変数名を付けて値を格納することができます。
例えば、「user=taro」「age=18」「blood=b」という3つのパラメータを格納したい場合は以下のように記述します。
URLVariables オブジェクトに送信パラメータをセットする
// URLVariables オブジェクトを作成する
var url_var:URLVariables = new URLVariables();
// パラメータをセットする
url_var.user = "taro";
url_var.age = 18;
url_var.blood = "b";
■変数ストリングを使って送信データを格納する
decode() メソッドを使用すると、変数ストリングによる指定でパラメータをセットすることができます。
例えば、「user=taro」「age=18」「blood=b」という3つのパラメータを格納したい場合は以下のように記述します。
変数ストリングを使って URLVariables オブジェクトに送信パラメータをセットする
// URLVariables オブジェクトを作成する
var url_var:URLVariables = new URLVariables();
// 変数ストリングでパラメータをセットする
url_var.decode("user=taro&age=18&blood=b");
■URLVariables オブジェクトを URLRequest オブジェクトにセットする
URLRequest オブジェクトに data というプロパティがあるので、URLVariables オブジェクトをセットします。
URLVariables オブジェクトを URLRequest オブジェクトにセットする
// CGI ページの URL
var url:String = "http://hakuhin.jp/test.cgi";
var url_request:URLRequest = new URLRequest(url);
// HTTP メソッドを指定する
url_request.method = URLRequestMethod.POST;
// URLVariables オブジェクトを作成する
var url_var:URLVariables = new URLVariables();
// パラメータをセットする
url_var.user = "taro";
url_var.age = 18;
url_var.blood = "b";
// URLVariables オブジェクトを URLRequest オブジェクトにセットする
url_request.data = url_var;
■使用例
CGI にデータを送信しつつ、ブラウザで CGI のページを開く例です。
CGI にデータを送信しつつ、ブラウザで CGI のページを開く
// CGI ページの URL
var url:String = "http://hakuhin.jp/test.cgi";
var url_request:URLRequest = new URLRequest(url);
// HTTP メソッドを指定する
url_request.method = URLRequestMethod.POST;
// URLVariables オブジェクトを作成する
var url_var:URLVariables = new URLVariables();
// パラメータをセットする
url_var.user = "taro";
url_var.age = 18;
url_var.blood = "b";
// URLVariables オブジェクトを URLRequest オブジェクトにセットする
url_request.data = url_var;
// ブラウザで CGI ページを開く
navigateToURL(url_request , "_blank");
■URLLoader クラスを使用する
URLLoader クラスを使用すると、CGI にデータを送信し、結果を受け取ることができます。
まずは、URLRequest クラスについての解説です。
■URLRequest クラスについて
URLRequest クラスを使って、「送信先のURL」 と 「HTTP メソッド」と「送信データ」を指定します。
■URLRequest オブジェクトを作成する
URLRequest クラスをインスタンス化して、 URLRequest オブジェクトを作成します。
引数に、CGI までの URL か相対パスを指定します。
URLRequest オブジェクトを作成する
// CGI ページの URL
var url:String = "http://hakuhin.jp/test.cgi";
var url_request:URLRequest = new URLRequest(url);
インスタンス化した後で、url プロパティからセットすることもできます。
URLRequest オブジェクトを作成して url を指定する
// CGI ページの URL
var url:String = "http://hakuhin.jp/test.cgi";
var url_request:URLRequest = new URLRequest();
url_request.url = url;
■HTTP メソッドを指定する
HTTP メソッドを指定するには、method プロパティに以下の定数をセットします。
デフォルトは、URLRequestMethod.GET です。
| 定数 | 説明 |
| URLRequestMethod.GET | GET メソッドを使用する |
| URLRequestMethod.POST | POST メソッドを使用する |
GET メソッドは、URL 文字列にパラメータを付加する事で情報を送ります。送信できるサイズに限界があるので、パラメータの総量が少ない時に利用します。
POST メソッドは、大容量のデータを送る事ができます。
HTTP メソッドを指定する
// CGI ページの URL
var url:String = "http://hakuhin.jp/test.cgi";
var url_request:URLRequest = new URLRequest(url);
url_request.method = URLRequestMethod.GET;
■送信データについて
■URLVariables オブジェクトを作成する
CGI に送信したいデータがある場合、URLVariables クラスを使用します。
URLVariables クラスは、データを格納するための入れ物として使用します。まずはインスタンス化して URLVariables オブジェクトを作成します。
URLVariables オブジェクトを作成する
var url_var:URLVariables = new URLVariables();
■送信データを格納する
URLVariables オブジェクトは、Object のように変数名を付けて値を格納することができます。
例えば、「user=taro」「age=18」「blood=b」という3つのパラメータを格納したい場合は以下のように記述します。
URLVariables オブジェクトに送信パラメータをセットする
// URLVariables オブジェクトを作成する
var url_var:URLVariables = new URLVariables();
// パラメータをセットする
url_var.user = "taro";
url_var.age = 18;
url_var.blood = "b";
■変数ストリングを使って送信データを格納する
decode() メソッドを使用すると、変数ストリングによる指定でパラメータをセットすることができます。
例えば、「user=taro」「age=18」「blood=b」という3つのパラメータを格納したい場合は以下のように記述します。
変数ストリングを使って URLVariables オブジェクトに送信パラメータをセットする
// URLVariables オブジェクトを作成する
var url_var:URLVariables = new URLVariables();
// 変数ストリングでパラメータをセットする
url_var.decode("user=taro&age=18&blood=b");
■URLVariables オブジェクトを URLRequest オブジェクトにセットする
URLRequest オブジェクトに data というプロパティがあるので、URLVariables オブジェクトをセットします。
URLVariables オブジェクトを URLRequest オブジェクトにセットする
// CGI ページの URL
var url:String = "http://hakuhin.jp/test.cgi";
var url_request:URLRequest = new URLRequest(url);
// HTTP メソッドを指定する
url_request.method = URLRequestMethod.POST;
// URLVariables オブジェクトを作成する
var url_var:URLVariables = new URLVariables();
// パラメータをセットする
url_var.user = "taro";
url_var.age = 18;
url_var.blood = "b";
// URLVariables オブジェクトを URLRequest オブジェクトにセットする
url_request.data = url_var;
■URLLoader クラスをインスタンス化する
次に URLLoader クラスをインスタンス化します。
引数は省略します。
URLLoader オブジェクトを作成する
// URLLoader オブジェクトを作成する
var url_loader : URLLoader = new URLLoader();
■CGI からのデータの受け取り方を設定する
CGI からのデータの受け取り方を設定するには、dataFormat プロパティを使用します。
以下の定数をセットします。
| 型 | 文字列 | 説明 |
| URLLoaderDataFormat. TEXT | "text" | テキスト形式で読み込みます。結果、data プロパティにString 型で格納されます。 |
| URLLoaderDataFormat. BINARY | "binary" | バイナリ形式で読み込みます。結果、data プロパティにByteArray 型で格納されます。 |
| URLLoaderDataFormat. VARIABLES | "variables" | 「application/x-www-form-urlencoded」形式(URL エンコード形式)として受信します。結果、data プロパティに URLVariables 型で格納されます。 |
URL エンコード形式の変数として受信する
// URLLoader オブジェクトを作成する
var url_loader : URLLoader = new URLLoader();
// URL エンコード形式の変数として受信する
url_loader.dataFormat = URLLoaderDataFormat.VARIABLES;
■CGI へアクセスを開始する
load() メソッドを使用すると CGI へアクセスを開始します。
引数に URLRequest オブジェクトを指定します。
すでに読み込み中にもかかわらずこのメソッドを呼び出した場合は、以前の読み込み処理が終了し新しく読み込みを開始します。
URLLoader.load ( URLRequest型 , LoaderContext型 );
| 第01引数 | URLRequest オブジェクトを指定します。 |
| 第02引数(略可) | セキュリティに関する情報をLoaderContext型で指定します。 |
| 戻り値 | なし |
load() メソッドを使ってCGI へのアクセスを試みる
// CGI ページの URL
var url:String = "http://hakuhin.jp/test.cgi";
var url_request : URLRequest = new URLRequest(url);
// URLLoader オブジェクトを作成する
var url_loader : URLLoader = new URLLoader();
// URL エンコード形式の変数として受信する
url_loader.dataFormat = URLLoaderDataFormat.VARIABLES;
// CGI にアクセスする
url_loader.load(url_request);
■CGI からの読み込みを停止する
CGI からの読み込みを停止したい場合は、close() メソッドを呼び出します。
読み込みを開始していないときに呼び出したり、すでに停止した後にもう一度呼び出すとエラーとなります。
読み込みを停止する
// CGI ページの URL
var url:String = "http://hakuhin.jp/test.cgi";
var url_request : URLRequest = new URLRequest(url);
// URLLoader オブジェクトを作成する
var url_loader : URLLoader = new URLLoader();
// URL エンコード形式の変数として受信する
url_loader.dataFormat = URLLoaderDataFormat.VARIABLES;
// CGI にアクセスする
url_loader.load(url_request);
try{
// 読み込みを停止する
url_loader.close();
}catch(e:Error){
trace("停止失敗");
}
■CGI からの読み込みのローティング状況を知る
CGI からのデータをどれだけ読み込まれたかのローディング状況を知りたい場合は、
Event.OPEN、
ProgressEvent.PROGRESS、
Event.COMPLETE、
IOErrorEvent.IO_ERROR
SecurityErrorEvent.SECURITY_ERROR
イベントを使用します。
CGI の出力結果に Content-Length ヘッダ情報が含まれない場合、読込途中で bytesTotal の値を取得する事はできません。
ProgressEvent.PROGRESS、
Event.COMPLETE、
IOErrorEvent.IO_ERROR
SecurityErrorEvent.SECURITY_ERROR
読み込み状況を知る
// CGI ページの URL
var url:String = "http://hakuhin.jp/test.cgi";
var url_request : URLRequest = new URLRequest(url);
// URLLoader オブジェクトを作成
var url_loader : URLLoader = new URLLoader();
// URL エンコード形式の変数として受信する
url_loader.dataFormat = URLLoaderDataFormat.VARIABLES;
url_loader.addEventListener (Event.OPEN,URLLoaderOpenFunc);
function URLLoaderOpenFunc (event : Event) {
trace ("読み込みを開始した");
}
url_loader.addEventListener (ProgressEvent.PROGRESS,URLLoaderProgressFunc);
function URLLoaderProgressFunc (event : ProgressEvent) {
trace ("読込:" + event.bytesLoaded);
trace ("全体:" + event.bytesTotal);
trace ("パーセント:" + Math.floor(event.bytesLoaded/event.bytesTotal*100));
}
url_loader.addEventListener (Event.COMPLETE,URLLoaderCompleteFunc);
function URLLoaderCompleteFunc (event : Event) {
trace ("読み込みを完了");
}
url_loader.addEventListener (IOErrorEvent.IO_ERROR,URLLoaderIOErrorFunc);
function URLLoaderIOErrorFunc (event : IOErrorEvent) {
trace ("ファイル入出力のエラー");
}
url_loader.addEventListener (SecurityErrorEvent.SECURITY_ERROR,
URLLoaderSecurityErrorFunc);
function URLLoaderSecurityErrorFunc (event : SecurityErrorEvent) {
trace ("セキュリティのエラー");
}
// CGI へのアクセス開始
url_loader.load(url_request);
bytesLoaded プロパティ、bytesTotal プロパティ を使用して調べる事もできます。
CGI の出力結果に Content-Length ヘッダ情報が含まれない場合、読込途中で bytesTotal の値を取得する事はできません。
読み込み状況を知る
// CGI ページの URL
var url:String = "http://hakuhin.jp/test.cgi";
var url_request : URLRequest = new URLRequest(url);
// URLLoader オブジェクトを作成する
var url_loader : URLLoader = new URLLoader();
// URL エンコード形式の変数として受信する
url_loader.dataFormat = URLLoaderDataFormat.VARIABLES;
// CGI にアクセスする
url_loader.load(url_request);
stage.addEventListener (Event.ENTER_FRAME,EnterFrameFunc);
function EnterFrameFunc (event : Event) {
trace ("読込:" + url_loader.bytesLoaded);
trace ("全体:" + url_loader.bytesTotal);
trace ("パーセント:" + Math.floor(url_loader.bytesLoaded / url_loader.bytesTotal*100));
}
■CGI からのデータを取得する
CGI からの読み込みが完了すると URLLoader オブジェクトの data プロパティにCGI からのデータが格納されています。
格納されているデータは、dataFormat プロパティの設定により変化します。
■URLLoaderDataFormat.VARIABLES を指定していた場合
データフォーマットに VARIABLES を指定していた場合、
data プロパティには、URLVariables オブジェクトが格納されています。
URLVariables オブジェクトは Object のように値を取り出すことができます。
例えばCGI から、「user=hanako」「age=16」「blood=o」という 3 つのパラメータが送られてきた場合に取り出す例です。
CGI からのデータを取り出す
// CGI ページの URL
var url:String = "http://hakuhin.jp/test.cgi";
var url_request : URLRequest = new URLRequest(url);
// URLLoader オブジェクトを作成する
var url_loader : URLLoader = new URLLoader();
// URL エンコード形式の変数として受信する
url_loader.dataFormat = URLLoaderDataFormat.VARIABLES;
// CGI の読み込み完了時に呼び出されるイベント
url_loader.addEventListener (Event.COMPLETE,URLLoaderCompleteFunc);
function URLLoaderCompleteFunc (event : Event) {
var url_var:URLVariables = url_loader.data;
trace (url_var.user);
trace (url_var.age);
trace (url_var.blood);
}
// CGI にアクセスする
url_loader.load(url_request);
■URLLoaderDataFormat.TEXT を指定していた場合
データフォーマットに TEXT を指定していた場合、
data プロパティには、String 型が格納されています。
文字列が、「application/x-www-form-urlencoded」形式であれば、URLVariables オブジェクトに変換することができます。
例えばCGI から、「user=hanako&age=16&blood=o」という文字列が送られてきた場合に取り出す例です。
CGI からの文字列データを URLVariables オブジェクトに変換して取り出す
// CGI ページの URL
var url:String = "http://hakuhin.jp/test.cgi";
var url_request : URLRequest = new URLRequest(url);
// URLLoader オブジェクトを作成する
var url_loader : URLLoader = new URLLoader();
// テキスト形式の変数として受信する
url_loader.dataFormat = URLLoaderDataFormat.TEXT;
// CGI の読み込み完了時に呼び出されるイベント
url_loader.addEventListener (Event.COMPLETE,URLLoaderCompleteFunc);
function URLLoaderCompleteFunc (event : Event) {
var str:String = url_loader.data;
// 文字列から URLVariables オブジェクトを作成
var url_var:URLVariables = new URLVariables(str);
trace (url_var.user);
trace (url_var.age);
trace (url_var.blood);
}
// CGI にアクセスする
url_loader.load(url_request);
CGI 側のデータ送受信処理について
■CGI 側のデータ送受信処理について
CGI 側でデータを受け取って結果を出力する方法として、以下のスクリプトを使用してみます。
■Perl を使用する
Perl を利用して、パラメータの受信とパラメータの出力処理を行ってみます。
■GET メソッドを使った受信について
GET メソッドであるか調べるには、$ENV{'REQUEST_METHOD'} が "GET" であるか比較します。
リクエストメソッドを調べる
#!/usr/local/bin/perl
# GETメソッドであるか調べる
if ($ENV{'REQUEST_METHOD'} eq "GET") {
}
GET メソッドであれば、$ENV{'QUERY_STRING'} を取得します。URL 文字列の "?" 以降の文字列を取得することができます。
さらに "&" で区切って、"変数名=値" を取り出します。
さらに "=" で区切って、変数名と値を分離し、連想配列に格納します。
受信したパラメータから変数を作成する
#!/usr/local/bin/perl
# パラメータを格納する為の連想配列
%request_param;
# GETメソッドであるか調べる
if ($ENV{'REQUEST_METHOD'} eq "GET") {
# URL の ? 以降の文字列を取得する
$query = $ENV{'QUERY_STRING'};
# "&" で区切って、配列に格納する
@list = split(/&/,$query);
foreach(@list) {
# "=" で区切る
($k,$v) = split(/=/,$_);
# URL デコードを行い値を連想配列に格納する
$request_param{"$k"} = UrlDecode($v);
}
}
#// -----------------------------------------------------
#// URLデコード
#// -----------------------------------------------------
sub UrlDecode {
my $str = @_[0];
$str =~ tr/+/ /;
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
return $str;
}
■POST メソッドを使った受信について
POST メソッドであるか調べるには、$ENV{'REQUEST_METHOD'} が "POST" であるか比較します。
リクエストメソッドを調べる
#!/usr/local/bin/perl
# POSTメソッドであるか調べる
if ($ENV{'REQUEST_METHOD'} eq "POST") {
}
POST メソッドであれば、標準入力を使用してパラメータを取得します。
さらに "&" で区切って、"変数名=値" を取り出します。
さらに "=" で区切って、変数名と値を分離し、連想配列に格納します。
受信したパラメータから変数を作成する
#!/usr/local/bin/perl
# パラメータを格納する為の連想配列
%request_param;
# POSTメソッドであるか調べる
if ($ENV{'REQUEST_METHOD'} eq "POST") {
# 標準入力からパラメータを取得する
read (STDIN, $query, $ENV{'CONTENT_LENGTH'});
# "&" で区切って、配列に格納する
@list = split(/&/,$query);
foreach(@list) {
# "=" で区切る
($k,$v) = split(/=/,$_);
# URL デコードを行い値を連想配列に格納する
$request_param{"$k"} = UrlDecode($v);
}
}
#// -----------------------------------------------------
#// URLデコード
#// -----------------------------------------------------
sub UrlDecode {
my $str = @_[0];
$str =~ tr/+/ /;
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
return $str;
}
■Flash 側で読み込めるように文字列を出力する
出力結果は、テキストやバイナリ形式であれば Flash 側で読み込むことができます。
ここでは、「application/x-www-form-urlencoded」形式で出力してみます。
文字列を出力するには、print 命令を使用します。
まず、コンテンツタイプとして "application/x-www-form-urlencoded" を出力します。
コンテンツタイプを出力する
#!/usr/local/bin/perl
# Content-type を出力
print "Content-type:application/x-www-form-urlencoded\n\n";
次に、『変数名=値』という書式で出力します。
複数のパラメータを出力したい場合は、『&』で区切ります。
例えば、「user=hanako」「age=16」「blood=o」という3つのパラメータを出力したい場合、「user=hanako&age=16&blood=o」という文字列が出力されるようにします。
パラメータを出力する
#!/usr/local/bin/perl
# Content-type を出力
print "Content-type:application/x-www-form-urlencoded\n\n";
# 変数
$user = "hanako";
$age = 16;
$blood = "o";
# パラメータを出力
print "user=" . "$user";
print "&";
print "age=" . "$age";
print "&";
print "blood=" . "$blood";
■PHP を使用する
PHP を利用して、パラメータの受信とパラメータの出力処理を行ってみます。
■GET メソッドを使った受信について
GET メソッドであるか調べるには、$_SERVER['REQUEST_METHOD'] が "GET" であるか比較します。
リクエストメソッドを調べる
<?php
# GETメソッドであるか調べる
if ($_SERVER['REQUEST_METHOD'] == "GET") {
}
?>
クライアントから GET メソッドで送信されたパラメータを取得するには、$_GETを使用します。
中身は連想配列となっています。
GETメソッド のパラメータを取得する
<?php
# パラメータを格納する為の連想配列
$request_param;
# GETメソッドであるか調べる
if ($_SERVER['REQUEST_METHOD'] == "GET") {
foreach ( $_GET as $k => $v){
# URL デコードを行い値を連想配列に格納する
$request_param{"$k"} = urldecode($v);
}
}
?>
■POST メソッドを使った受信について
POST メソッドであるかを取得するには、$_SERVER['REQUEST_METHOD'] が "POST" であるかを調べます。
リクエストメソッドを調べる
<?php
# POSTメソッドであるか調べる
if ($_SERVER['REQUEST_METHOD'] == "POST") {
}
?>
クライアントから POST メソッドで送信されたパラメータを取得するには、$_POSTを使用します。
中身は連想配列となっています。
POSTメソッド のパラメータを取得する
<?php
# パラメータを格納する為の連想配列
$request_param;
# POSTメソッドであるか調べる
if ($_SERVER['REQUEST_METHOD'] == "POST") {
foreach ( $_POST as $k => $v){
# URL デコードを行い値を連想配列に格納する
$request_param{"$k"} = urldecode($v);
}
}
?>
■Flash 側で読み込めるように文字列を出力する
出力結果は、テキストやバイナリ形式であれば Flash 側で読み込むことができます。
ここでは、「application/x-www-form-urlencoded」形式で出力してみます。
文字列を出力するには、echo 命令を使用します。
まず、コンテンツタイプとして "application/x-www-form-urlencoded" を出力します。
コンテンツタイプを出力する
<?php
# Content-type を出力
header("Content-type:application/x-www-form-urlencoded");
?>
次に、『変数名=値』という書式で出力します。
複数のパラメータを出力したい場合は、『&』で区切ります。
例えば、「user=hanako」「age=16」「blood=o」という3つのパラメータを出力したい場合、「user=hanako&age=16&blood=o」という文字列が出力されるようにします。
パラメータを出力する
<?php
# Content-type を出力
header("Content-type:application/x-www-form-urlencoded");
# 変数
$user = "hanako";
$age = 16;
$blood = "o";
# パラメータを出力
echo "user=" . $user;
echo "&";
echo "age=" . $age;
echo "&";
echo "blood=" . $blood;
?>
■Ruby を使用する
Ruby を利用して、パラメータの受信とパラメータの出力処理を行ってみます。
■GET メソッドを使った受信について
GET メソッドであるか調べるには、ENV['REQUEST_METHOD'] が "GET" であるか比較します。
リクエストメソッドを調べる
#!/usr/local/bin/ruby
# GETメソッドであるか調べる
if ENV['REQUEST_METHOD'] == "GET" then
end
GET メソッドであれば、ENV['QUERY_STRING'] を取得します。URL 文字列の "?" 以降の文字列を取得することができます。
さらに "&" で区切って、"変数名=値" を取り出します。
さらに "=" で区切って、変数名と値を分離し、連想配列に格納します。
受信したパラメータを連想配列に格納する
#!/usr/local/bin/ruby
# ライブラリをロード
require 'cgi'
# パラメータを格納する為の連想配列
request_param = Hash.new
# GETメソッドであるか調べる
if ENV['REQUEST_METHOD'] == "GET" then
# URL の ? 以降の文字列を取得する
query = ENV['QUERY_STRING']
# "&" で区切る
for q in query.split("&") do
# "=" で区切る
k, v = q.split("=",2)
# URL デコードを行い連想配列に格納
request_param[k] = CGI.unescape(v);
end
end
■POST メソッドを使った受信について
POST メソッドであるか調べるには、ENV['REQUEST_METHOD'] が "POST" であるか比較します。
リクエストメソッドを調べる
#!/usr/local/bin/ruby
# POSTメソッドであるか調べる
if (ENV['REQUEST_METHOD'] == "POST") {
}
POST メソッドであれば、標準入力を使用してパラメータを取得します。
さらに "&" で区切って、"変数名=値" を取り出します。
さらに "=" で区切って、変数名と値を分離し、連想配列に格納します。
受信したパラメータを連想配列に格納する
#!/usr/local/bin/ruby
# ライブラリをロード
require 'cgi'
# パラメータを格納する為の連想配列
request_param = Hash.new
# POSTメソッドであるか調べる
if ENV['REQUEST_METHOD'] == "POST" then
# 標準入力からパラメータを取得する
query = STDIN.read(ENV['CONTENT_LENGTH'].to_i)
# "&" で区切る
for q in query.split("&") do
# "=" で区切る
k, v = q.split("=",2)
# URL デコードを行い連想配列に格納
request_param[k] = CGI.escape(v);
end
end
■Flash 側で読み込めるように文字列を出力する
出力結果は、テキストやバイナリ形式であれば Flash 側で読み込むことができます。
ここでは、「application/x-www-form-urlencoded」形式で出力してみます。
文字列を出力するには、print 命令を使用します。
まず、コンテンツタイプとして "application/x-www-form-urlencoded" を出力します。
コンテンツタイプを出力する
#!/usr/local/bin/ruby
# Content-type を出力
print "Content-Type: application/x-www-form-urlencoded\n\n"
次に、『変数名=値』という書式で出力します。
複数のパラメータを出力したい場合は、『&』で区切ります。
例えば、「user=hanako」「age=16」「blood=o」という3つのパラメータを出力したい場合、「user=hanako&age=16&blood=o」という文字列が出力されるようにします。
パラメータを出力する
#!/usr/local/bin/ruby
# Content-type を出力
print "Content-Type: application/x-www-form-urlencoded\n\n"
# 変数
user = "hanako"
age = 16
blood = "o"
# パラメータを出力
print "user=" + user
print "&"
print "age=" + age.to_s
print "&"
print "blood=" + blood
■Python を使用する
Python を利用して、パラメータの受信とパラメータの出力処理を行ってみます。
■GET メソッドを使った受信について
GET メソッドであるか調べるには、os.getenv('REQUEST_METHOD') が "GET" であるか比較します。
リクエストメソッドを調べる
#!/usr/local/bin/python
# coding: utf-8
# ライブラリをロード
import os
# GETメソッドであるか調べる
if os.getenv('REQUEST_METHOD') == "GET" :
print "GET METHOD"
GET メソッドであれば、os.getenv('QUERY_STRING') を取得します。URL 文字列の "?" 以降の文字列を取得することができます。
さらに "&" で区切って、"変数名=値" を取り出します。
さらに "=" で区切って、変数名と値を分離し、連想配列に格納します。
受信したパラメータを連想配列に格納する
#!/usr/local/bin/python
# coding: utf-8
# ライブラリをロード
import os
import urllib
# パラメータを格納する為の連想配列
request_param = dict()
# GETメソッドであるか調べる
if os.getenv('REQUEST_METHOD') == "GET" :
# URL の ? 以降の文字列を取得する
query = os.getenv('QUERY_STRING')
# "&" で区切る
for q in query.split('&') :
# "=" で区切る
k, v = q.split("=",2)
# URL デコードを行い連想配列に格納
request_param[k] = urllib.unquote(v)
■POST メソッドを使った受信について
POST メソッドであるか調べるには、os.getenv('REQUEST_METHOD') が "POST" であるか比較します。
リクエストメソッドを調べる
#!/usr/local/bin/python
# coding: utf-8
# ライブラリをロード
import os
# POSTメソッドであるか調べる
if os.getenv('REQUEST_METHOD') == "POST" :
print "POST METHOD"
POST メソッドであれば、標準入力を使用してパラメータを取得します。
さらに "&" で区切って、"変数名=値" を取り出します。
さらに "=" で区切って、変数名と値を分離し、連想配列に格納します。
受信したパラメータを連想配列に格納する
#!/usr/local/bin/python
# coding: utf-8
# ライブラリをロード
import os
import sys
import urllib
# パラメータを格納する為の連想配列
request_param = dict()
# POSTメソッドであるか調べる
if os.getenv('REQUEST_METHOD') == "POST" :
# 標準入力からパラメータを取得する
query = sys.stdin.read(int(os.getenv('CONTENT_LENGTH')))
# "&" で区切る
for q in query.split('&') :
# "=" で区切る
k, v = q.split("=",2)
# URL デコードを行い連想配列に格納
request_param[k] = urllib.unquote(v)
■Flash 側で読み込めるように文字列を出力する
出力結果は、テキストやバイナリ形式であれば Flash 側で読み込むことができます。
ここでは、「application/x-www-form-urlencoded」形式で出力してみます。
文字列を出力するには、「sys.stdout.write() メソッド」を使用します。
まず、コンテンツタイプとして "application/x-www-form-urlencoded" を出力します。
コンテンツタイプを出力する(文字コードを UTF-8 とする)
#!/usr/local/bin/python
# coding: utf-8
# ライブラリをロード
import sys
# Content-type を出力
sys.stdout.write("Content-Type: application/x-www-form-urlencoded\n\n")
次に、『変数名=値』という書式で出力します。
複数のパラメータを出力したい場合は、『&』で区切ります。
例えば、「user=hanako」「age=16」「blood=o」という3つのパラメータを出力したい場合、「user=hanako&age=16&blood=o」という文字列が出力されるようにします。
パラメータを出力する(文字コードを UTF-8 とする)
#!/usr/local/bin/python
# coding: utf-8
# ライブラリをロード
import sys
# Content-type を出力
sys.stdout.write("Content-Type: application/x-www-form-urlencoded\n\n")
# 変数
user = "hanako"
age = 16
blood = "o"
# パラメータを出力
sys.stdout.write("user=" + user)
sys.stdout.write("&")
sys.stdout.write("age=" + str(age))
sys.stdout.write("&")
sys.stdout.write( "blood=" + blood)
Flash と CGI との連携での注意点
■文字コードについて
Flash 6 以降では、「 Flash Player 内部の文字コード」が「UTF-8」となります。
「日本語を含む CGI の結果を Flash で受け取る」場合、CGI 側の文字コードを UTF-8 にします。
どうしても CGI 側の文字コードを Shift-JIS にする必要がある場合、System.useCodePage プロパティを true に変更します。
コードページを有効にすると、「CGI の文字コード」を「 OS 内部の文字コード」と同じものと解釈します。例えば、英語版の Windows XP では "CP1252"、日本語版の Windows XP では "Shift-JIS" となります。
OS 内部の文字コードと同じ文字コードとして解釈する
System.useCodePage = true;
■日本語などの全角文字の使用について
Flash からCGI に送信するときに、文字列を URL エンコードします。
URL エンコードを行うことで、「日本語などの全角文字」を「英数字と記号のみを使用した文字列」に変換することができます。
Flash 側で URL エンコードを行うには、escape() 関数を使用します。
文字列を URL エンコードする
var str = "あいうえお";
str = escape(str);
trace(str);
CGI側で文字列を受け取るときは、URL デコードを行い、元の「日本語などの全角文字」に復元します。
■サンドボックスによる制限について
「Flash を設置しているサーバ」と「CGI を設置しているサーバ」のドメインが違う場合、アクセスすることができません。
サンドボックスの制限を解除して CGI にアクセスするには、「CGI を設置しているサーバ」側にクロスドメインポリシーファイルを設置する必要があります。
■CGI の結果に広告が表示されるレンタルサーバを使用する
CGI の結果に強制的に広告が表示されるサーバを利用する場合、Flash 側で広告の情報を除去する必要があります。
「application/x-www-form-urlencoded」形式で出力する場合、CGI の結果の前頭と最後尾に "&" 記号を追加します。
CGI の結果が、
「"user=hanako&age=16&blood=o"」
だった場合、前後に広告が付く事により、
「"dummyuser=hanako&age=16&blood=odummy"」
となり、「変数名=値&変数名=値&変数名=値」というフォーマットが崩れます。
そこで、先頭と最後尾に "&" 記号を追加することで「"dummy&user=hanako&age=16&blood=o&dummy"」
という形になるようにします。
完全な対策ではありませんが、これで広告情報が無効なデータであると Flash Player に判別させる事ができます。
