Flash 側のデータ送受信処理について
■Flash 側のデータ送受信処理について
「Flash と CGI の連携」において、 Flash 側で可能な処理として、以下の方法があります。
■getURL() 関数を使用する (Flash 4 以降の場合)
getURL() 関数を使用すると、CGI にデータを送信しつつ、ブラウザで CGI のページを開くことができます。
getURL( CGI の URL , ターゲットウィンドウ名 , HTTP メソッド);
第01引数 | CGI の URL を指定 |
第02引数(略可) | ターゲットウィンドウ名を指定、"_blank" など |
第03引数(略可) | GET メソッドで送信するなら "GET"、POST メソッドで送信するなら "POST" |
戻り値 | なし |
■第01引数 送信するURLとパラメータを指定
CGI の URL か相対パスを指定します。
■第02引数 ターゲットウィンドウ名を指定
ブラウザで開くターゲットウィンドウ名を指定します。名前以外に以下の文字を指定することもできます。
文字列 | 説明 |
_self | 現在のウィンドウ |
_blank | 新規にウィンドウを開く |
_parent | 現在のウィンドウから1つ上(親)のウィンドウ |
_top | 現在のウィンドウの最上位(ルート)のウィンドウ |
■第03引数 HTTP メソッドを指定する
"GET" か "POST" を指定します。
GET メソッドは、URL 文字列にパラメータを付加する事で情報を送ります。送信できるサイズに限界があるので、パラメータの総量が少ない時に利用します。
POST メソッドは、大容量のデータを送る事ができます。
なお POST メソッドは、ローカル環境では動作しないようです。
■HTTP メソッドを省略したときのデータの送信について
第03引数を省略した場合、URL 文字列の最後に "?" を付けて、"変数名=値" という書式で記述すると、GET メソッドとしてパラメータを送信できます。
複数のパラメータを指定したいときは、"&" で区切ります。
例えば、「http://hakuhin.jp/test.cgi」というURLに、
「user=taro」「age=18」「blood=b」という3つのパラメータを送信したい場合は以下のように記述します。
「user=taro」「age=18」「blood=b」という3つのパラメータを送信したい場合は以下のように記述します。
URL に情報を付加してページを開く
var url = "http://hakuhin.jp/test.cgi?user=taro&age=18&blood=b";
getURL(url , "_blank");
■HTTP メソッドを指定したときのデータの送信について
第03引数で HTTP メソッドを指定した場合、getURL() 関数を実行した階層(this)のすべての変数名と値が送信されます。
例えば、_root.send のタイムラインで getURL() 関数を呼び出すと、_root.send にあるすべての変数名と値が送信されることになります。
パラメータを送信しつつ 外部の CGI ページを開く
// 送信したいパラメータをセット
this.user = "taro";
this.age = 18;
this.blood = "b";
// パラメータを送信しつつ 外部の CGI ページを開く
getURL("http://hakuhin.jp/test.cgi" , "_blank" , "POST");
■loadVariables() 関数を使用する (Flash 4 以降の場合)
loadVariables() 関数を使用すると、CGI にデータを送信し、結果を受け取ることができます。
受け取ったパラメータを格納する場所は、好きなムービークリップを指定することができます。
loadVariables(CGI の URL,データの受信に利用するムービークリップターゲット,HTTP メソッド);
第01引数 | CGI の URL を指定 |
第02引数 | データの受信に使用するムービークリップを指定 |
第03引数(略可) | GET メソッドで送信するなら "GET"、POST メソッドで送信するなら "POST" |
戻り値 | なし |
■第01引数 送信するURLとパラメータを指定
CGI の URL か相対パスを指定します。
■第02引数 受信に利用するムービークリップのパスを指定
CGI からの結果を受信するために利用するムービークリップを指定します。
CGI の結果を受け取ると、変数名に応じてムービークリップ内に新しく「変数」が作られ「値」が格納されます。
例えば、ムービークリップのターゲットとして「_root.recv」を指定します。
CGI から、「user=hanako」「age=16」「blood=o」という3つのパラメータが得られた場合、受信完了時に以下のように変数が格納されます。
■第03引数 HTTP メソッドを指定する
"GET" か "POST" を指定します。
GET メソッドは、URL 文字列にパラメータを付加する事で情報を送ります。送信できるサイズに限界があるので、パラメータの総量が少ない時に利用します。
POST メソッドは、大容量のデータを送る事ができます。
■HTTP メソッドを省略したときのデータの送信について
第03引数を省略した場合、URL 文字列の最後に "?" を付けて、"変数名=値" という書式で記述すると、GET メソッドとしてパラメータを送信できます。
複数のパラメータを指定したいときは、"&" で区切ります。
例えば、「http://hakuhin.jp/test.cgi」というURLに、
「user=taro」「age=18」「blood=b」という3つのパラメータを送信したい場合は以下のように記述します。
「user=taro」「age=18」「blood=b」という3つのパラメータを送信したい場合は以下のように記述します。
URL に情報を付加して CGI に送信、結果を _root.recv に格納する
var url = "http://hakuhin.jp/test.cgi?user=taro&age=18&blood=b";
loadVariables(url , _root.recv);
■HTTP メソッドを指定したときのデータの送信について
第03引数で HTTP メソッドを指定した場合、loadVariables() 関数を実行した階層(this)のすべての変数名と値が送信されます。
例えば、_root.send のタイムラインで loadVariables() 関数を呼び出すと、_root.send にあるすべての変数名と値が送信されることになります。
CGI にパラメータを送信して結果を _root.recv に格納する
// 送信したいパラメータをセット
this.user = "taro";
this.age = 18;
this.blood = "b";
// CGI にパラメータを送信して結果を _root.recv に格納する
loadVariables("http://hakuhin.jp/test.cgi" , _root.recv , "POST");
■CGI の結果の取得に成功したか調べる(Flash 4 の場合)
Flash 4 では、CGI の結果の取得に成功したか調べるイベントがありません。
そこで、サーバーからパラメータが得られる予定である変数を監視して中身が変更されたか調べます。一定の時間が経過しても変化がなければタイムアウトとします。
■CGI の結果の取得に成功したか調べる(Flash 5 以降の場合)
CGI の結果の取得に成功したか調べるには、onClipEvent (data) イベントハンドラを使用します。
loadVariables 関数の第02引数で指定したムービークリップに記述します。
受信に失敗したか調べるイベントはありません。送信を試みてから一定の時間が経過しても変化がなければタイムアウトとします。
受信に成功したか調べる
onClipEvent (load) {
this.user = "taro";
this.age = 18;
this.blood = "b";
// CGI にパラメータを送信して結果をここに格納する
loadVariables("http://hakuhin.jp/test.cgi" , this , "POST");
}
onClipEvent (data) {
trace("受信成功");
}
■CGI の結果の取得に成功したか調べる(Flash 6 以降の場合)
CGI の結果の取得に成功したか調べるには、onData イベントを使用します。
loadVariables 関数の第02引数で指定したムービークリップに記述します。
受信に失敗したか調べるイベントはありません。送信を試みてから一定の時間が経過しても変化がなければタイムアウトとします。
CGI の結果の取得に成功したか調べる
// 送信したいパラメータをセット
this.user = "taro";
this.age = 18;
this.blood = "b";
// CGI の結果の読み込み完了時に呼び出されるイベント
_root.recv.onData = function (){
trace("受信成功");
};
// CGI にパラメータを送信して結果を _root.recv に格納する
loadVariables("http://hakuhin.jp/test.cgi" , _root.recv , "POST");
■loadVariablesNum() 関数を使用する (Flash 4 以降の場合)
loadVariablesNum() 関数を使用すると、CGI にデータを送信し、結果を受け取ることができます。
受け取ったパラメータを格納する場所は、_level0 ~ _level15 のどれかを指定することができます。
loadVariablesNum(CGI の URL,データの受信に利用する_level 階層の数値,HTTP メソッド);
第01引数 | CGI の URL を指定 |
第02引数 | 受け取る _level 階層の数値を指定(0 ~ 15) |
第03引数(略可) | GET メソッドで送信するなら "GET"、POST メソッドで送信するなら "POST" |
戻り値 | なし |
■第01引数 送信するURLとパラメータを指定
CGI の URL か相対パスを指定します。
■第02引数 受信に利用するムービークリップのパスを指定
CGI からの結果を受信するために利用する _level 階層を指定します。
_level 階層は、外部から読み込んだデータを格納する為に用意されている領域です。16 段階 (_level0 ~ _level15) まで存在します。
level0 が _root にあたります。数値が高いほど手前になります。
CGI の結果を受け取ると、変数名に応じて_level 階層内に新しく「変数」が作られ「値」が格納されます。
例えば、1 を指定します。これは _level1 に相当します。
CGI から、「user=hanako」「age=16」「blood=o」という3つのパラメータが得られた場合、受信完了時に以下のように変数が格納されます。
■第03引数 HTTP メソッドを指定する
"GET" か "POST" を指定します。
GET メソッドは、URL 文字列にパラメータを付加する事で情報を送ります。送信できるサイズに限界があるので、パラメータの総量が少ない時に利用します。
POST メソッドは、大容量のデータを送る事ができます。
■HTTP メソッドを省略したときのデータの送信について
第03引数を省略した場合、URL 文字列の最後に "?" を付けて、"変数名=値" という書式で記述すると、GET メソッドとしてパラメータを送信できます。
複数のパラメータを指定したいときは、"&" で区切ります。
例えば、「http://hakuhin.jp/test.cgi」というURLに、
「user=taro」「age=18」「blood=b」という3つのパラメータを送信したい場合は以下のように記述します。
「user=taro」「age=18」「blood=b」という3つのパラメータを送信したい場合は以下のように記述します。
URL に情報を付加して CGI に送信、結果を _level1 に格納する
var url = "http://hakuhin.jp/test.cgi?user=taro&age=18&blood=b";
loadVariablesNum(url , 1);
■HTTP メソッドを指定したときのデータの送信について
第03引数で HTTP メソッドを指定した場合、loadVariablesNum() 関数を実行した階層(this)のすべての変数名と値が送信されます。
例えば、_root.send のタイムラインで loadVariablesNum() 関数を呼び出すと、_root.send にあるすべての変数名と値が送信されることになります。
CGI にパラメータを送信して結果を _level1 に格納する
// 送信したいパラメータをセット
this.user = "taro";
this.age = 18;
this.blood = "b";
// CGI にパラメータを送信して結果を _level1 に格納する
loadVariablesNum("http://hakuhin.jp/test.cgi" , 1 , "POST");
■CGI の結果の取得に成功したか調べる
loadVariablesNum 関数を使用した場合、CGI の結果の取得に成功したか調べるイベントは無いようです。
そこで、サーバーからパラメータが得られる予定である変数を監視して中身が変更されたか調べます。一定の時間が経過しても変化がなければタイムアウトとします。
■loadVariables() メソッドを使用する (Flash 5 以降の場合)
loadVariables() メソッドを使用すると、CGI にデータを送信し、結果を受け取ることができます。
CGI の結果を受け取る為に利用するムービークリップから呼び出します。
ムービークリップ.loadVariables(CGI の URL , HTTP メソッド);
第01引数 | CGI の URL を指定 |
第02引数(略可) | GET メソッドで送信するなら "GET"、POST メソッドで送信するなら "POST" |
戻り値 | なし |
■第01引数 送信するURLとパラメータを指定
CGI の URL か相対パスを指定します。
■第02引数 HTTP メソッドを指定する
"GET" か "POST" を指定します。
GET メソッドは、URL 文字列にパラメータを付加する事で情報を送ります。送信できるサイズに限界があるので、パラメータの総量が少ない時に利用します。
POST メソッドは、大容量のデータを送る事ができます。
CGI の結果を受け取ると、変数名に応じてムービークリップ内に新しく「変数」が作られ「値」が格納されます。
例えば、ムービークリップ「_root.recv」から loadVariables() メソッドを呼び出します。
CGI から、「user=hanako」「age=16」「blood=o」という3つのパラメータが得られた場合、受信完了時に以下のように変数が格納されます。
■HTTP メソッドを省略したときのデータの送信について
第03引数を省略した場合、URL 文字列の最後に "?" を付けて、"変数名=値" という書式で記述すると、GET メソッドとしてパラメータを送信できます。
複数のパラメータを指定したいときは、"&" で区切ります。
例えば、「http://hakuhin.jp/test.cgi」というURLに、
「user=taro」「age=18」「blood=b」という3つのパラメータを送信したい場合は以下のように記述します。
「user=taro」「age=18」「blood=b」という3つのパラメータを送信したい場合は以下のように記述します。
URL に情報を付加して CGI に送信、結果を _root.recv に格納する
var url = "http://hakuhin.jp/test.cgi?user=taro&age=18&blood=b";
_root.recv.loadVariables(url);
■HTTP メソッドを指定したときのデータの送信について
第03引数で HTTP メソッドを指定した場合、loadVariables() メソッドを呼び出したムービークリップ内のすべての変数名と値が送信されます。
例えば、_root.recv から loadVariables() メソッドを呼び出すと、_root.recv にあるすべての変数名と値が送信されることになります。
CGI にパラメータを送信して結果を _root.recv に格納する
// 送信したいパラメータをセット
_root.recv.user = "taro";
_root.recv.age = 18;
_root.recv.blood = "b";
// CGI にパラメータを送信して結果を _root.recv に格納する
_root.recv.loadVariables("http://hakuhin.jp/test.cgi" , "POST");
■CGI の結果の取得に成功したか調べる(Flash 5 以降の場合)
CGI の結果の取得に成功したか調べるには、onClipEvent (data) イベントハンドラを使用します。
loadVariables メソッドを呼び出したムービークリップに記述します。
受信に失敗したか調べるイベントはありません。送信を試みてから一定の時間が経過しても変化がなければタイムアウトとします。
受信に成功したか調べる
onClipEvent (load) {
this.user = "taro";
this.age = 18;
this.blood = "b";
// CGI にパラメータを送信して結果をここに格納する
this.loadVariables("http://hakuhin.jp/test.cgi" , "POST");
}
onClipEvent (data) {
trace("受信成功");
}
■CGI の結果の取得に成功したか調べる(Flash 6 以降の場合)
CGI の結果の取得に成功したか調べるには、onData イベントを使用します。
loadVariables メソッドを呼び出したムービークリップに記述します。
受信に失敗したか調べるイベントはありません。送信を試みてから一定の時間が経過しても変化がなければタイムアウトとします。
CGI の結果の取得に成功したか調べる
// 送信したいパラメータをセット
_root.recv.user = "taro";
_root.recv.age = 18;
_root.recv.blood = "b";
// CGI の結果の読み込み完了時に呼び出されるイベント
_root.recv.onData = function (){
trace("受信成功");
};
// CGI にパラメータを送信して結果を _root.recv に格納する
_root.recv.loadVariables("http://hakuhin.jp/test.cgi" , "POST");
■LoadVars クラスを使用する (Flash 6 以降の場合)
LoadVars クラスを使用すると、CGI にデータを送信し、結果を受け取ることができます。
従来の方法より簡潔になっています。また。通信状態の通知などイベントが充実しています。
LoadVars オブジェクトを作成するには、LoadVars クラスをインスタンス化します。
LoadVars オブジェクトを作成する
var load_obj = new LoadVars();
■CGI にパラメータを送信しながらブラウザで CGI のページを開く
CGI にパラメータを送信しながらブラウザで CGI のページを開くには、send() メソッドを使用します。
LoadVars.send(CGI の URL , HTTP メソッド);
第01引数 | CGI の URL を指定 |
第02引数 | ターゲット window 名を指定、"_blank" など |
第03引数(略可) | GET メソッドで送信するなら "GET"、POST メソッドで送信するなら "POST" |
戻り値 | なし |
■第01引数 送信するURLとパラメータを指定
CGI の URL か相対パスを指定します。
■第03引数 HTTP メソッドを指定する
"GET" か "POST" を指定します。
GET メソッドは、URL 文字列にパラメータを付加する事で情報を送ります。送信できるサイズに限界があるので、パラメータの総量が少ない時に利用します。
POST メソッドは、大容量のデータを送る事ができます。
■CGI にパラメータを送信し結果を取得する
LoadVars.sendAndLoad(CGI の URL , 結果を受け取る為の LoadVars オブジェクト,HTTP メソッド);
第01引数 | CGI の URL を指定 |
第02引数 | 結果を受け取るための LoadVars オブジェクトを指定 |
第03引数(略可) | GET メソッドで送信するなら "GET"、POST メソッドで送信するなら "POST" |
戻り値 | なし |
■第01引数 送信するURLとパラメータを指定
CGI の URL か相対パスを指定します。
■第02引数 受信に利用する LoadVars オブジェクトを指定
CGI からのパラメータを格納するための LoadVars オブジェクトを新規に作成して第02引数で指定します。
CGI の結果を受け取ると、指定した LoadVars オブジェクト内に、変数名に応じて新しく「変数」が作られ「値」が格納されます。
CGI から、「user=hanako」「age=16」「blood=o」という3つのパラメータが得られた場合、受信完了時に以下のように変数が格納されます。
■第03引数 HTTP メソッドを指定する
"GET" か "POST" を指定します。
GET メソッドは、URL 文字列にパラメータを付加する事で情報を送ります。送信できるサイズに限界があるので、パラメータの総量が少ない時に利用します。
POST メソッドは、大容量のデータを送る事ができます。
省略した場合、POST メソッドとなります。
■データの送信について
LoadVars オブジェクトに、送信したい変数名と値を格納しておきます。
sendAndLoad() メソッドを呼び出すと、LoadVars オブジェクト内のすべての変数名と値が送信されます。
CGI にパラメータを送信して結果を recv_obj に格納する
var send_obj = new LoadVars(); // 送信用
var recv_obj = new LoadVars(); // 受信用
// 送信したいパラメータをセット
send_obj.user = "taro";
send_obj.age = 18;
send_obj.blood = "b";
// CGI にパラメータを送信して結果を recv_obj に格納する
send_obj.sendAndLoad("http://hakuhin.jp/test.cgi",recv_obj,"POST");
■CGI の結果の取得に成功したか調べる
CGI の結果の取得に成功したか調べるには、onLoad イベントを使用します。
登録したコールバック関数の第01引数から、受信に成功したかを知ることができます。 true であれば成功、false であれば失敗したことがわかります。
このイベントは、受信用の LoadVars() オブジェクトに登録します。
CGI の結果の取得に成功したか調べる
var send_obj = new LoadVars(); // 送信用
var recv_obj = new LoadVars(); // 受信用
// 読み込み処理終了時に呼び出されるイベント
recv_obj.onLoad = function (success){
if(success){
trace("受信成功");
}else{
trace("受信失敗");
}
};
// 送信したいパラメータをセット
send_obj.user = "taro";
send_obj.age = 18;
send_obj.blood = "b";
// CGI にパラメータを送信して結果を recv_obj に格納する
send_obj.sendAndLoad("http://hakuhin.jp/test.cgi",recv_obj,"POST");
また、loaded プロパティを使って調べることもできます。
CGI の結果の取得に成功したか調べる
var send_obj = new LoadVars(); // 送信用
var recv_obj = new LoadVars(); // 受信用
// 送信したいパラメータをセット
send_obj.user = "taro";
send_obj.age = 18;
send_obj.blood = "b";
// CGI にパラメータを送信して結果を recv_obj に格納する
send_obj.sendAndLoad("http://hakuhin.jp/test.cgi",recv_obj,"POST");
// 毎フレーム実行されるイベント
onEnterFrame = function (){
if(recv_obj.loaded){
trace("受信成功");
}else{
trace("受信中");
}
};
読み込み状況を把握する
どれだけ読み込まれたかバイト数で調べたい場合は、getBytesLoaded() メソッド 、ファイルの総バイト数が知りたい場合は、getBytesTotal() メソッドを使用します。
このメソッドは、受信用の LoadVars() オブジェクトから呼び出します。
CGI の出力結果に Content-Length ヘッダ情報が含まれない場合、読込途中で getBytesTotal() の値を取得する事はできません。
読み込み状況を調べる
var send_obj = new LoadVars(); // 送信用
var recv_obj = new LoadVars(); // 受信用
// 送信したいパラメータをセット
send_obj.user = "taro";
send_obj.age = 18;
send_obj.blood = "b";
// CGI にパラメータを送信して結果を recv_obj に格納する
send_obj.sendAndLoad("http://hakuhin.jp/test.cgi",recv_obj,"POST");
// 毎フレーム実行されるイベント
onEnterFrame = function (){
trace("読込" + recv_obj.getBytesLoaded());
trace("全体" + recv_obj.getBytesTotal());
trace("パーセント" + Math.floor(recv_obj.getBytesLoaded() / recv_obj.getBytesTotal() * 100));
};
404 などのHTTPステータスを取得したい場合は、onHTTPStatus イベントを使用します。(Flash 8 以降)
このメソッドは、受信用の LoadVars() オブジェクトから呼び出します。
HTTPステータスを取得
var send_obj = new LoadVars(); // 送信用
var recv_obj = new LoadVars(); // 受信用
// HTTPステータスを取得
recv_obj.onHTTPStatus = function (code){
trace("CODE:" + code);
};
// 送信したいパラメータをセット
send_obj.user = "taro";
send_obj.age = 18;
send_obj.blood = "b";
// CGI にパラメータを送信して結果を recv_obj に格納する
send_obj.sendAndLoad("http://hakuhin.jp/test.cgi",recv_obj,"POST");
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 側で読み込めるように文字列を出力する
文字列を出力するには、print 命令を使用します。
Flash 側で正常に読み込まれるには、「application/x-www-form-urlencoded」形式である必要があります。
まず、コンテンツタイプとして "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 側で読み込めるように文字列を出力する
文字列を出力するには、echo 命令を使用します。
Flash 側で正常に読み込まれるには、「application/x-www-form-urlencoded」形式である必要があります。
まず、コンテンツタイプとして "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 側で読み込めるように文字列を出力する
文字列を出力するには、print 命令を使用します。
Flash 側で正常に読み込まれるには、「application/x-www-form-urlencoded」形式である必要があります。
まず、コンテンツタイプとして "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 側で読み込めるように文字列を出力する
文字列を出力するには、「sys.stdout.write() メソッド」を使用します。
Flash 側で正常に読み込まれるには、「application/x-www-form-urlencoded」形式である必要があります。
まず、コンテンツタイプとして "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 5 以前では、「 Flash Player 内部の文字コード」が 「OS 内部の文字コード」と同じものになります。例えば、英語版の Windows XP では "CP1252"、日本語版の Windows XP では "Shift-JIS" となります。
Flash 6 以降では、「 Flash Player 内部の文字コード」が「UTF-8」となります。
Flash 5 以前で CGI へ日本語データを送信する場合、Shift-JIS として送られる事になります。
Flash 5 以前で、「日本語を含む CGI の結果を Flash で受け取る」場合、CGI 側の文字コードを Shift-JIS にする必要があります。
Flash 6 以降で、「日本語を含む CGI の結果を Flash で受け取る」場合、CGI 側の文字コードを UTF-8 にします。
Flash 6 以降で、どうしても CGI 側の文字コードを Shift-JIS にする必要がある場合、System.useCodePage プロパティを true に変更します。
コードページを有効にすると、「CGI の文字コード」を「 OS 内部の文字コード」と同じものと解釈します。
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 の結果に強制的に広告が表示されるサーバを利用する場合、CGI の結果の前頭と最後尾に "&" 記号を追加します。
CGI の結果が、
「"user=hanako&age=16&blood=o"」
だった場合、前後に広告が付く事により、
「"dummyuser=hanako&age=16&blood=odummy"」
となり、「変数名=値&変数名=値&変数名=値」というフォーマットが崩れます。
そこで、先頭と最後尾に "&" 記号を追加することで「"dummy&user=hanako&age=16&blood=o&dummy"」
という形になるようにします。
完全な対策ではありませんが、これで広告情報が無効なデータであると Flash Player に判別させる事ができます。