Flashゲームプログラミング講座 for ActionScript3.0

 

Flash からリクエストを送信する

 
 


■リクエストを送信して、ブラウザで新しいページを開く

 
navigateToURL() 関数を使用します。
 
ブラウザで新しいページを開く事ができます。
 
リクエスト情報を送信する事もできます。
 
navigateToURL ( request , "ターゲット名" ):void
第01引数 URLRequestリクエストに関する情報を指定
第02引数(略可)Stringターゲットウィンドウ名を指定、"_blank" など
戻り値 voidなし
 
■第01引数 リクエスト
 
リクエストに関する情報を指定します。
 
URLRequest クラスについては、こちらで解説しています。
 
■第02引数 ターゲットウィンドウ名
 
ブラウザ側で開かれる対象となる、ウィンドウの名前を指定します。
 
以下の文字を指定する事もできます。
 
文字列 説明
"_self" 現在のウィンドウ
"_blank" 新規にウィンドウを開く
"_parent" 現在のウィンドウから1つ上(親)のウィンドウ
"_top" 現在のウィンドウの最上位(ルート)のウィンドウ
 
■ブラウザを使って通信内容を確認する
 
ブラウザの開発者向けツールを使用すると、通信内容を確認する事ができます。
 
使用方法は、こちらで解説しています。
 
■使用例
 
ブラウザで新しいページを開く

import flash.net.URLRequest;
import flash.net.navigateToURL;

// ------------------------------------------------------------
// URLRequest オブジェクトを作成する
// ------------------------------------------------------------
var url_request:URLRequest = new URLRequest("http://example.com/");

// ------------------------------------------------------------
// ブラウザで新しいページを開く
// ------------------------------------------------------------
navigateToURL(url_request , "_blank");
 
リクエストを送信しつつ、ブラウザで新しいページを開く

import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;
import flash.net.navigateToURL;

// ------------------------------------------------------------
// URLRequest オブジェクトを作成する
// ------------------------------------------------------------
var url_request:URLRequest = new URLRequest("http://example.com/cgi-bin/test.cgi");

// ------------------------------------------------------------
// URLVariables オブジェクトを作成する
// ------------------------------------------------------------
var url_variables:URLVariables = new URLVariables();

// ------------------------------------------------------------
// 送信したい「名前と値情報」を追加する
// ------------------------------------------------------------
url_variables["user"] = "taro";
url_variables["age"] = "18";
url_variables["blood"] = "b";

// ------------------------------------------------------------
// 送信データを設定する
// ------------------------------------------------------------
// 「HTTP メソッド」を設定する
url_request.method = URLRequestMethod.GET;

// リクエストの「コンテンツタイプ」を設定する
url_request.contentType = "application/x-www-form-urlencoded";

// 「送信したいデータ」を指定する
url_request.data = url_variables;

// ------------------------------------------------------------
// ブラウザで新しいページを開く
// ------------------------------------------------------------
navigateToURL(url_request , "_blank");
 

■リクエストを送信して、レスポンス結果を無視する

 
sendToURL() 関数を使用します。
 
リクエスト情報を、送信する事ができます。
 
しかし、レスポンス結果を得る方法はありません。
 
レスポンス結果を取得したい場合は、URLLoader クラスを使用します。
 
sendToURL ( request ):void
第01引数 URLRequestリクエストに関する情報を指定
戻り値 voidなし
 
■第01引数 リクエスト
 
リクエストに関する情報を指定します。
 
URLRequest クラスについては、こちらで解説しています。
 
■ブラウザを使って通信内容を確認する
 
ブラウザの開発者向けツールを使用すると、通信内容を確認する事ができます。
 
使用方法は、こちらで解説しています。
 
■使用例
 
リクエストを送信する(レスポンス結果は無視する)

import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;
import flash.net.sendToURL;

// ------------------------------------------------------------
// URLRequest オブジェクトを作成する
// ------------------------------------------------------------
var url_request:URLRequest = new URLRequest("http://example.com/cgi-bin/test.cgi");

// ------------------------------------------------------------
// URLVariables オブジェクトを作成する
// ------------------------------------------------------------
var url_variables:URLVariables = new URLVariables();

// ------------------------------------------------------------
// 送信したい「名前と値情報」を追加する
// ------------------------------------------------------------
url_variables["user"] = "taro";
url_variables["age"] = "18";
url_variables["blood"] = "b";

// ------------------------------------------------------------
// 送信データを設定する
// ------------------------------------------------------------
// 「HTTP メソッド」を設定する
url_request.method = URLRequestMethod.POST;

// リクエストの「コンテンツタイプ」を設定する
url_request.contentType = "application/x-www-form-urlencoded";

// 「送信したいデータ」を指定する
url_request.data = url_variables;

// ------------------------------------------------------------
// リクエストを送信する(レスポンス結果は無視する)
// ------------------------------------------------------------
sendToURL(url_request);
 


 

URLLoader クラスについて

 
 


■ URLLoader クラスについて

 
URLLoader クラスを使用すると、HTTP 通信を行う事ができます。
 
リクエスト情報を送信し、レスポンス結果を受け取る事ができます。
 
外部ファイルを読み込む場合にも活躍します。
 
■ Adobe AIR での動作について
 
Adobe AIR の場合、より本格的な HTTP 通信が実現できます。
 

■ URLLoader クラスの機能一覧

 
■プロパティ
 
プロパティ 説明
bytesLoaded Number これまでに完了した受信バイト数を取得する
bytesTotal Number 全体の受信バイト数を取得する
dataFormat String 受信するデータ型を設定する (URLLoaderDataFormat.*)
data * 受信したレスポンスボディの内容を取得する
 
■メソッド
 
メソッド 説明
load() 「HTTP 通信」を手動的に開始する
close() 「HTTP 通信」を中止する
 
■イベント
 
イベントタイプ 説明
OPEN Event (1) HTTP 通信を開始した
HTTP_RESPONSE_STATUS HTTPStatusEvent (2) レスポンスヘッダの受信は完了した
PROGRESS ProgressEvent (3) レスポンスボディを受信中
HTTP_STATUS HTTPStatusEvent (4) HTTP 通信が完了した(成功失敗に関わらず)
 
イベントタイプ 説明
COMPLETE Event HTTP 通信に成功した(レスボンスの取得可
IO_ERROR IOErrorEvent HTTP 通信に失敗した
SECURITY_ERROR SecurityErrorEvent HTTP 通信に失敗した(セキュリティ関連)
 

■ URLLoader オブジェクトを作成する

 
new 演算子を使って、URLLoader クラスをインスタンス化します。
 
引数を指定した場合、HTTP 通信はすぐに開始されます。
 
HTTP 通信を手動的に開始したい場合は、引数を省略します。
 
new URLLoader ( request ):URLLoader
第01引数(略可)URLRequestURLRequest オブジェクトを指定
戻り値 URLLoaderURLLoader オブジェクトが得られる
 
URLLoader オブジェクトを作成する

import flash.net.URLLoader;

// ------------------------------------------------------------
// URLLoader オブジェクトを作成する
// ------------------------------------------------------------
var url_loader:URLLoader = new URLLoader();

// 出力テスト
trace(url_loader);
 
URLLoader オブジェクトを作成し、HTTP 通信を開始する

import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.events.Event;
import flash.events.HTTPStatusEvent;

// ------------------------------------------------------------
// URLRequest オブジェクトを作成する
// ------------------------------------------------------------
var url_request:URLRequest = new URLRequest("http://example.com/");

// ------------------------------------------------------------
// URLLoader オブジェクトを作成する(HTTP 通信を開始する)
// ------------------------------------------------------------
var url_loader:URLLoader = new URLLoader(url_request);

// ------------------------------------------------------------
// HTTP 通信が完了すると実行されるイベント(成功失敗に関わらず)
// ------------------------------------------------------------
url_loader.addEventListener( HTTPStatusEvent.HTTP_STATUS , function (e:HTTPStatusEvent):void{

	// HTTP ステータスを出力
	trace(e.status);

});

// ------------------------------------------------------------
// HTTP 通信に成功すると実行されるイベント(レスボンス結果の取得可能)
// ------------------------------------------------------------
url_loader.addEventListener( Event.COMPLETE , function (e:Event):void{

	// レスポンスボディを出力
	trace(url_loader.data);

});
 


 

Flash 側のデータ送信処理について

 
 


■「HTTP メソッド」を指定する

 
method プロパティを使用します。
 
■ Flash Player 版の場合
 
定数文字列説明
URLRequestMethod.GET"GET"GET メソッド
URLRequestMethod.POST"POST"POST メソッド
 
■ Adobe AIR 版の場合
 
Adobe AIR では、さらに以下の種類があります。
 
定数文字列説明
URLRequestMethod.HEAD"HEAD"HEAD メソッド
URLRequestMethod.OPTIONS"OPTIONS"OPTIONS メソッド
URLRequestMethod.DELETE"DELETE"DELETE メソッド
URLRequestMethod.PUT"PUT"PUT メソッド
 

■ HTTP メソッドについて

 
■ GET メソッド
 
GET メソッドは、送信データを、URL 文字列に埋め込んで送信します。
 
ユーザーが URL 文字列を見れば、送信した内容を容易に推測できます
 
送信できるサイズに限界があるので、パラメータの総量が少ない時に利用します。
 
■ POST メソッド
 
POST メソッドは、送信データを、リクエストボディ内に格納して送信します。
 
大容量のデータを送る事ができます。
 
ファイルのアップロードなどに最適です。
 
■ HEAD メソッド (Adobe AIR のみ)
 
HEAD メソッドは、レスポンスヘッダのみ取得を試みます
 
レスポンスボディは、受信結果に含まれません。
 
コンテンツタイプなどのヘッダ情報だけを調べたい場合に便利です。
 
クエリパラメータの送信方法は、GET メソッドと同じです。
 

■リクエストヘッダを設定する

 
■「リクエストヘッダ」をまとめて設定する
 
requestHeaders プロパティを使用します。
 
このプロパティは、Array 型です。
 
中に、URLRequestHeader オブジェクトを格納します。
 
ヘッダ1つ分に相当します。
 
■リクエストヘッダの一例
 
セキュリティの都合上、設定できない項目もあります。
 
カスタムヘッダの追加は、「POST メソッド」でのみ可能です。
 
ヘッダフィールドの種類 変更可 説明
"Content-Type" 送信データのコンテンツタイプ
"Referer" × 送信元の URL アドレス情報
"User-Agent" × ブラウザやOSなどのユーザーエージェント情報
 

■「リクエストヘッダ」の「コンテンツタイプ」を設定する

 
contentType プロパティを使用します。
 
送信データのフォーマットを、サーバーに通知する事ができます。
 
送信データは、data プロパティから指定します。
 

■コンテンツタイプの一例

 
文字列 説明
text/plain テキスト文書
text/html HTML 文書
application/xml XML 文書
application/json JSON 文書
application/x-www-form-urlencoded 『変数名=値&変数名=値&変数名=値&変数名=値』の形式
例えば「user=taro」「age=18」「blood=b」という3つのパラメータを送信したい場合
『user=taro&age=18&blood=b』
multipart/form-data ファイルアップロード用のフォーマット
 

■「送信したいデータ」を指定する

 
data プロパティを使用します。
 
別途、コンテンツタイプの指定も必要です。
 
■プレーンテキストを送信する場合
 
contentType プロパティに、"text/plain" をセットします。
 
data プロパティに、文字列をセットします。
 
送信データを設定する(プレーンテキスト形式)

import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;

// ------------------------------------------------------------
// URLRequest オブジェクトを作成する
// ------------------------------------------------------------
var url_request:URLRequest = new URLRequest("http://example.com/cgi-bin/test.cgi");

// ------------------------------------------------------------
// 送信データを設定する
// ------------------------------------------------------------
// 「HTTP メソッド」を設定する
url_request.method = URLRequestMethod.POST;

// リクエストの「コンテンツタイプ」を設定する
url_request.contentType = "text/plain";

// 「送信したいデータ」を指定する
url_request.data = "Send Test !!";

// ------------------------------------------------------------
// HTTP 通信を開始する
// ------------------------------------------------------------
// URLLoader オブジェクトを作成する
var url_loader:URLLoader = new URLLoader();

// HTTP 通信を開始する
url_loader.load(url_request);
 
■「x-www-form-urlencoded」文字列を送信する場合
 
contentType プロパティに、"application/x-www-form-urlencoded" をセットします。
 
data プロパティに、URLVariables オブジェクトをセットします。
 
送信データを設定する(x-www-form-urlencoded 形式)

import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;

// ------------------------------------------------------------
// URLRequest オブジェクトを作成する
// ------------------------------------------------------------
var url_request:URLRequest = new URLRequest("http://example.com/cgi-bin/test.cgi");

// ------------------------------------------------------------
// URLVariables オブジェクトを作成する
// ------------------------------------------------------------
var url_variables:URLVariables = new URLVariables();

// ------------------------------------------------------------
// 送信したい「名前と値情報」を追加する
// ------------------------------------------------------------
url_variables["user"] = "taro";
url_variables["age"] = "18";
url_variables["blood"] = "b";

// ------------------------------------------------------------
// 送信データを設定する
// ------------------------------------------------------------
// 「HTTP メソッド」を設定する
url_request.method = URLRequestMethod.GET;

// リクエストの「コンテンツタイプ」を設定する
url_request.contentType = "application/x-www-form-urlencoded";

// 「送信したいデータ」を指定する
url_request.data = url_variables;

// ------------------------------------------------------------
// HTTP 通信を開始する
// ------------------------------------------------------------
// URLLoader オブジェクトを作成する
var url_loader:URLLoader = new URLLoader();

// HTTP 通信を開始する
url_loader.load(url_request);
 

■ HTTP 通信を開始する

 
HTTP 通信を手動的に開始するには、load() メソッドを使用します。
 
このメソッドは非同期実行です。
 
HTTP 通信の結果は、イベントを使って受け取ります。
 
URLLoader.load ( request ):void
第01引数 URLRequestURLRequest オブジェクトを指定
戻り値 voidなし
 
■ブラウザを使って通信内容を確認する
 
ブラウザの開発者向けツールを使用すると、通信内容を確認する事ができます。
 
使用方法は、こちらで解説しています。
 
■使用例
 
HTTP 通信を手動的に開始する

import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.events.Event;
import flash.events.HTTPStatusEvent;

// ------------------------------------------------------------
// URLRequest オブジェクトを作成する
// ------------------------------------------------------------
var url_request:URLRequest = new URLRequest("http://example.com/");

// ------------------------------------------------------------
// URLLoader オブジェクトを作成する
// ------------------------------------------------------------
var url_loader:URLLoader = new URLLoader();

// ------------------------------------------------------------
// HTTP 通信が完了すると実行されるイベント(成功失敗に関わらず)
// ------------------------------------------------------------
url_loader.addEventListener( HTTPStatusEvent.HTTP_STATUS , function (e:HTTPStatusEvent):void{

	// HTTP ステータスを出力
	trace(e.status);

});

// ------------------------------------------------------------
// HTTP 通信に成功すると実行されるイベント(レスボンス結果の取得可能)
// ------------------------------------------------------------
url_loader.addEventListener( Event.COMPLETE , function (e:Event):void{

	// レスポンスボディを出力
	trace(url_loader.data);

});

// ------------------------------------------------------------
// HTTP 通信を開始する
// ------------------------------------------------------------
url_loader.load(url_request);
 

■ HTTP 通信を中止する

 
HTTP 通信を中止するには、close() メソッドを使用します。
 
HTTP 通信中ではない場合に呼び出すと、エラーが発生します。
 
URLLoader.close ( ):void
引数 voidなし
戻り値 voidなし
 

■ファイルのアップロードについて

 
別途、FileReference クラスを使用します。
 
ファイルをアップロードする方法については、こちらで解説しています。
 


 

Flash 側のデータ受信処理について

 
 


■ HTTP 通信の状態を調べる

 
HTTP 通信の状態を取得するには、以下のイベントを使用します。
 
HTTP_RESPONSE_STATUS イベントは、Adobe AIR のみです。
 
イベントタイプ 説明
OPEN Event (1) HTTP 通信を開始した
HTTP_RESPONSE_STATUS HTTPStatusEvent (2) レスポンスヘッダの受信は完了した
PROGRESS ProgressEvent (3) レスポンスボディを受信中
HTTP_STATUS HTTPStatusEvent (4) HTTP 通信が完了した(成功失敗に関わらず)
 
イベントタイプ 説明
COMPLETE Event (5) HTTP 通信に成功した(レスボンスの取得可
 
■取得例
 
HTTP 通信の状態を調べる

import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.events.HTTPStatusEvent;

// ------------------------------------------------------------
// URLLoader オブジェクトを作成する
// ------------------------------------------------------------
var url_loader:URLLoader = new URLLoader();

// ------------------------------------------------------------
// HTTP 通信を開始したときに実行されるイベント
// ------------------------------------------------------------
url_loader.addEventListener( Event.OPEN , function (e:Event):void{
	trace("(1) HTTP 通信を開始した");
});

// ------------------------------------------------------------
// レスポンスヘッダの受信が完了したときに実行されるイベント(Adobe AIR のみ)
// ------------------------------------------------------------
if(HTTPStatusEvent.HTTP_RESPONSE_STATUS){
	url_loader.addEventListener( HTTPStatusEvent.HTTP_RESPONSE_STATUS , function (e:HTTPStatusEvent):void{
		trace("(2) レスポンスヘッダの受信は完了した");
	});
}

// ------------------------------------------------------------
// レスポンスボディを受信中に繰り返し実行されるイベント
// ------------------------------------------------------------
url_loader.addEventListener( ProgressEvent.PROGRESS , function (e:ProgressEvent):void{
	trace("(3) レスポンスボディを受信中");
});

// ------------------------------------------------------------
// HTTP 通信が完了すると実行されるイベント(成功失敗に関わらず)
// ------------------------------------------------------------
url_loader.addEventListener( HTTPStatusEvent.HTTP_STATUS , function (e:HTTPStatusEvent):void{
	trace("(4) HTTP 通信が完了した(成功失敗に関わらず)");
});

// ------------------------------------------------------------
// HTTP 通信に成功すると実行されるイベント(レスボンス結果の取得可能)
// ------------------------------------------------------------
url_loader.addEventListener( Event.COMPLETE , function (e:Event):void{
	trace("(5) HTTP 通信に成功して、レスボンス結果の取得が可能");
});

// ------------------------------------------------------------
// URLRequest オブジェクトを作成する
// ------------------------------------------------------------
var url_request:URLRequest = new URLRequest("http://example.com/cgi-bin/test.cgi");

// ------------------------------------------------------------
// HTTP 通信を開始する
// ------------------------------------------------------------
url_loader.load(url_request);
 

■ HTTP 通信が完了したか調べる

 
■受信の結果イベントについて
 
以下の3つのイベントは、同時に発行されることはありません。
 
よって1つでも欠けている場合、通信の完了を取りこぼします。
 
イベントタイプ 説明
COMPLETE Event HTTP 通信に成功した(レスボンスの取得可
IO_ERROR IOErrorEvent HTTP 通信に失敗した
SECURITY_ERROR SecurityErrorEvent HTTP 通信に失敗した(セキュリティ関連)
 
■ HTTP 通信が完了したか調べる(成功失敗に関係無く)
 
HTTPStatusEvent.HTTP_STATUS イベントを使用します。
 
このイベントは、成功失敗に関係無く必ず発行されます。
 
HTTP_STATUS イベントから、レスポンスボディを取得する事は、まだできません。
 
dataFormat プロパティを変更できる最後のタイミングです。
 
■ HTTP ステータスコードを取得する
 
HTTPStatusEvent オブジェクトの、status プロパティから取得します。
 
0 が得られる場合、HTTP 通信は失敗しています。
 
0 以外が得られる場合、HTTP 通信は成功しています。
 
HTTP 通信に成功しているからといって、リクエストが成功しているとは限りません。
 
サーバーからエラーコードが得られる場合があります。 (404、500、503 など)
 
■サーバへのリクエストが成功したか調べる
 
status プロパティが 200 である場合、リクエストに成功しています。
 
他には、2xx304 なども、リクエストの成功を意味します。
 
■ Flash Player 版の動作について
 
リクエストに失敗した場合、HTTP 通信の失敗とみなされます。
 
この場合、IOErrorEvent.IO_ERROR イベントが発行されます。
 
リクエストに成功した場合のみ、Event.COMPLETE イベントは発行されます。
 
■ Adobe AIR 版の動作について
 
リクエストに失敗している場合でも、HTTP 通信は継続します。
 
404、500、503 などのリクエストの失敗は、HTTP 通信の成功とみなされます。
 
HTTP 通信に成功していれば、Event.COMPLETE イベントは必ず発行されます。
 
リクエストの結果は関係ありません。
 
■取得例
 
status プロパティを使って HTTP 通信の成功失敗を調べる

import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.events.HTTPStatusEvent;

// ------------------------------------------------------------
// URLLoader オブジェクトを作成する
// ------------------------------------------------------------
var url_loader:URLLoader = new URLLoader();

// ------------------------------------------------------------
// HTTP 通信が完了すると実行されるイベント(成功失敗に関わらず)
// ------------------------------------------------------------
url_loader.addEventListener( HTTPStatusEvent.HTTP_STATUS , function (e:HTTPStatusEvent):void{

	// ------------------------------------------------------------
	// HTTP 通信失敗
	// ------------------------------------------------------------
	if(e.status == 0){

		trace("HTTP 通信失敗");

	// ------------------------------------------------------------
	// HTTP 通信成功
	// ------------------------------------------------------------
	}else{

		trace("HTTP 通信成功");
		trace("status:" + e.status);

		// ------------------------------------------------------------
		// リクエスト成功
		// ------------------------------------------------------------
		if((200 <= e.status && e.status < 300) || (e.status == 304)){

			trace("リクエスト成功");

		// ------------------------------------------------------------
		// リクエスト失敗
		// ------------------------------------------------------------
		}else{

			trace("リクエスト失敗");

		}
	}

});

// ------------------------------------------------------------
// HTTP 通信が正常終了すると実行されるイベント(レスボンス結果の取得可能)
// ------------------------------------------------------------
url_loader.addEventListener( Event.COMPLETE , function (e:Event):void{
	trace("レスボンス結果の取得可能");
});

// ------------------------------------------------------------
// URLRequest オブジェクトを作成する
// ------------------------------------------------------------
var url_request:URLRequest = new URLRequest("http://example.com/cgi-bin/test.cgi");

// ------------------------------------------------------------
// HTTP 通信を開始する
// ------------------------------------------------------------
url_loader.load(url_request);
 
イベントを使って HTTP 通信の成功失敗を調べる

import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;

// ------------------------------------------------------------
// URLLoader オブジェクトを作成する
// ------------------------------------------------------------
var url_loader:URLLoader = new URLLoader();

// ------------------------------------------------------------
// HTTP 通信に成功すると実行されるイベント(レスボンス結果の取得可能)
// ------------------------------------------------------------
url_loader.addEventListener( Event.COMPLETE , function (e:Event):void{
	trace("HTTP 通信成功");
});

// ------------------------------------------------------------
// HTTP 通信に失敗すると実行されるイベント
// ------------------------------------------------------------
url_loader.addEventListener( IOErrorEvent.IO_ERROR , function (e:IOErrorEvent):void{
	trace("HTTP 通信失敗");
});

// ------------------------------------------------------------
// HTTP 通信に失敗すると実行されるイベント (セキュリティ関連)
// ------------------------------------------------------------
url_loader.addEventListener( SecurityErrorEvent.SECURITY_ERROR , function (e:SecurityErrorEvent):void{
	trace("HTTP 通信失敗(原因はセキュリティ)");
});

// ------------------------------------------------------------
// URLRequest オブジェクトを作成する
// ------------------------------------------------------------
var url_request:URLRequest = new URLRequest("http://example.com/cgi-bin/test.cgi");

// ------------------------------------------------------------
// HTTP 通信を開始する
// ------------------------------------------------------------
url_loader.load(url_request);
 

■受信したレスポンスヘッダを取得する (Adobe AIR のみ)

 
■レスポンスヘッダの受信が完了したか調べる
 
HTTPStatusEvent.HTTP_RESPONSE_STATUS イベントを使用します。
 
■レスポンスヘッダを取得する
 
HTTPStatusEvent オブジェクトの、responseHeaders プロパティから取得します。
 
配列が得られます。
 
中には、URLRequestHeader オブジェクトが格納されています。
 
■レスポンスヘッダの一例
 
ヘッダの種類 説明
Content-Type 受信データのコンテンツタイプ
Content-Length 受信データのバイトサイズ
Last-Modified 最終更新日
 
■取得例
 
レスポンスヘッダをすべて取得する (Adobe AIR)

import flash.net.URLRequest;
import flash.net.URLRequestHeader;
import flash.net.URLLoader;
import flash.events.HTTPStatusEvent;

// ------------------------------------------------------------
// レスポンスヘッダ文字列からオブジェクトに変換する関数
// ------------------------------------------------------------
function ResponseHeadersParseObject(responseHeaders:Array):Object{
	var o:Object = new Object();
	var h:URLRequestHeader;
	var n:int = responseHeaders.length;
	var i:int;
	for(i=0;i < n;i++){
		h = responseHeaders[i];
		o[h.name] = h.value;
	}
	return o;
}

// ------------------------------------------------------------
// URLLoader オブジェクトを作成する
// ------------------------------------------------------------
var url_loader:URLLoader = new URLLoader();

// ------------------------------------------------------------
// レスポンスヘッダの受信が完了したときに実行されるイベント(Adobe AIR のみ)
// ------------------------------------------------------------
url_loader.addEventListener( HTTPStatusEvent.HTTP_RESPONSE_STATUS , function (e:HTTPStatusEvent):void{

	// ------------------------------------------------------------
	// レスポンスヘッダのリストを取得する
	// ------------------------------------------------------------
	var header_list:Array = e.responseHeaders;

	// ------------------------------------------------------------
	// ヘッダフィールドの総数を取得
	// ------------------------------------------------------------
	var num:int = header_list.length;

	// ------------------------------------------------------------
	// ヘッダを順番に取得
	// ------------------------------------------------------------
	var i:int;
	for(i=0;i < num;i++){
		// レスポンスヘッダを取得する
		var header:URLRequestHeader = header_list[i];
		// 名前を取得する
		var name:String = header.name;
		// 値を取得する
		var value:String = header.value;
		// 出力テスト
		trace("name:" + name + " value:" + value);

	}

	// ------------------------------------------------------------
	// レスポンスヘッダのリストを連想配列に変換する
	// ------------------------------------------------------------
	var response_headers:Object = ResponseHeadersParseObject(e.responseHeaders);

	// 出力テスト
	trace( response_headers["Content-Type"]   );
	trace( response_headers["Content-Length"] );
	trace( response_headers["Last-Modified"]  );
});

// ------------------------------------------------------------
// URLRequest オブジェクトを作成する
// ------------------------------------------------------------
var url_request:URLRequest = new URLRequest("http://example.com/cgi-bin/test.cgi");

// ------------------------------------------------------------
// HTTP 通信を開始する
// ------------------------------------------------------------
url_loader.load(url_request);
 

■受信したレスポンスボディを、任意のデータ型で取得する

 
■受信するデータ型を指定する
 
dataFormat プロパティを使用します。
 
以下の定数を指定します。
 
通常は、HTTP 通信を開始する前に設定します。
 
変更できる最後のタイミングは、HTTPStatusEvent.HTTP_STATUS イベント内です。
 
文字列説明得られる型
URLLoaderDataFormat.TEXT"text"テキストとして受信する。String
URLLoaderDataFormat.BINARY"binary"バイナリとして受信する。ByteArray
URLLoaderDataFormat.VARIABLES"variables"「x-www-form-urlencoded」形式のデータを受信する。URLVariables
 
■受信したレスポンスボディを取得する
 
data プロパティを使用します。
 
得られるデータ型は、dataFormat プロパティの設定によって変化します。
 
■取得可能なタイミングについて
 
Event.COMPLETE イベントを使用します。
 
このイベントが発行された場合に限り、レスポンス結果を得る事ができます。
 
■テキストファイルを読み込む例
 
テキストファイルを読み込む

import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;

// ------------------------------------------------------------
// URLLoader オブジェクトを作成する
// ------------------------------------------------------------
var url_loader:URLLoader = new URLLoader();

// ------------------------------------------------------------
// HTTP 通信に成功すると実行されるイベント(レスボンス結果の取得可能)
// ------------------------------------------------------------
url_loader.addEventListener( Event.COMPLETE , function (e:Event):void{

	// レスポンスボディを取得する
	var response:String = url_loader.data as String;

	// 出力テスト
	trace(response);
});

// ------------------------------------------------------------
// HTTP 通信に失敗すると実行されるイベント
// ------------------------------------------------------------
url_loader.addEventListener( IOErrorEvent.IO_ERROR , function (e:IOErrorEvent):void{
	trace("HTTP 通信失敗");
});

// ------------------------------------------------------------
// HTTP 通信に失敗すると実行されるイベント (セキュリティ関連)
// ------------------------------------------------------------
url_loader.addEventListener( SecurityErrorEvent.SECURITY_ERROR , function (e:SecurityErrorEvent):void{
	trace("HTTP 通信失敗(原因はセキュリティ)");
});

// ------------------------------------------------------------
// 受信フォーマットを設定
// ------------------------------------------------------------
url_loader.dataFormat = URLLoaderDataFormat.TEXT;

// ------------------------------------------------------------
// URLRequest オブジェクトを作成する
// ------------------------------------------------------------
var url_request:URLRequest = new URLRequest("http://example.com/download/string.txt");

// ------------------------------------------------------------
// HTTP 通信を開始する
// ------------------------------------------------------------
url_loader.load(url_request);
 
■バイナリファイルを読み込む例
 
バイナリファイルを読み込む

import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.utils.ByteArray;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;

// ------------------------------------------------------------
// URLLoader オブジェクトを作成する
// ------------------------------------------------------------
var url_loader:URLLoader = new URLLoader();

// ------------------------------------------------------------
// HTTP 通信に成功すると実行されるイベント(レスボンス結果の取得可能)
// ------------------------------------------------------------
url_loader.addEventListener( Event.COMPLETE , function (e:Event):void{

	// レスポンスボディを取得する
	var response:ByteArray = url_loader.data as ByteArray;

	// 出力テスト
	trace(response);
});

// ------------------------------------------------------------
// HTTP 通信に失敗すると実行されるイベント
// ------------------------------------------------------------
url_loader.addEventListener( IOErrorEvent.IO_ERROR , function (e:IOErrorEvent):void{
	trace("HTTP 通信失敗");
});

// ------------------------------------------------------------
// HTTP 通信に失敗すると実行されるイベント (セキュリティ関連)
// ------------------------------------------------------------
url_loader.addEventListener( SecurityErrorEvent.SECURITY_ERROR , function (e:SecurityErrorEvent):void{
	trace("HTTP 通信失敗(原因はセキュリティ)");
});

// ------------------------------------------------------------
// 受信フォーマットを設定
// ------------------------------------------------------------
url_loader.dataFormat = URLLoaderDataFormat.BINARY;

// ------------------------------------------------------------
// URLRequest オブジェクトを作成する
// ------------------------------------------------------------
var url_request:URLRequest = new URLRequest("http://example.com/download/binary.dat");

// ------------------------------------------------------------
// HTTP 通信を開始する
// ------------------------------------------------------------
url_loader.load(url_request);
 
■「x-www-form-urlencoded」形式のデータを受信する例
 
「x-www-form-urlencoded」形式のデータを受信する

import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLVariables;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;

// ------------------------------------------------------------
// URLLoader オブジェクトを作成する
// ------------------------------------------------------------
var url_loader:URLLoader = new URLLoader();

// ------------------------------------------------------------
// HTTP 通信に成功すると実行されるイベント(レスボンス結果の取得可能)
// ------------------------------------------------------------
url_loader.addEventListener( Event.COMPLETE , function (e:Event):void{

	// レスポンスボディを取得する
	var response:URLVariables = url_loader.data as URLVariables;

	// 出力テスト
	trace(response);
});

// ------------------------------------------------------------
// HTTP 通信に失敗すると実行されるイベント
// ------------------------------------------------------------
url_loader.addEventListener( IOErrorEvent.IO_ERROR , function (e:IOErrorEvent):void{
	trace("HTTP 通信失敗");
});

// ------------------------------------------------------------
// HTTP 通信に失敗すると実行されるイベント (セキュリティ関連)
// ------------------------------------------------------------
url_loader.addEventListener( SecurityErrorEvent.SECURITY_ERROR , function (e:SecurityErrorEvent):void{
	trace("HTTP 通信失敗(原因はセキュリティ)");
});

// ------------------------------------------------------------
// 受信フォーマットを設定
// ------------------------------------------------------------
url_loader.dataFormat = URLLoaderDataFormat.VARIABLES;

// ------------------------------------------------------------
// URLRequest オブジェクトを作成する
// ------------------------------------------------------------
var url_request:URLRequest = new URLRequest("http://example.com/cgi-bin/test.cgi");

// ------------------------------------------------------------
// HTTP 通信を開始する
// ------------------------------------------------------------
url_loader.load(url_request);
 

■受信中の進捗状況を調べる

 
■ URLLoader のプロパティから取得する
 
プロパティ 説明
bytesLoaded Number これまでに完了した受信バイト数を取得する
bytesTotal Number 全体の受信バイト数を取得する
 
■ ProgressEvent から取得する
 
ProgressEvent.PROGRESS イベントを使用します。
 
レスポンスボディを受信中に、繰り返し発行されます。
 
■ProgressEvent オブジェクトについて
 
ProgressEvent オブジェクトには、以下のプロパティがあります。
 
プロパティ 説明
bytesLoaded Number これまでに完了した受信バイト数を取得する
bytesTotal Number 全体の受信バイト数を取得する
 
■受信中の進捗状況を取得する例
 
受信中の進捗状況を取得する

import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.events.Event;
import flash.events.ProgressEvent;

// ------------------------------------------------------------
// URLLoader オブジェクトを作成する
// ------------------------------------------------------------
var url_loader:URLLoader = new URLLoader();

// ------------------------------------------------------------
// レスポンスボディを受信中に繰り返し実行されるイベント
// ------------------------------------------------------------
url_loader.addEventListener( ProgressEvent.PROGRESS , function (e:ProgressEvent):void{

	// これまでに完了した受信バイト数
	var loaded:Number = e.bytesLoaded;

	// 全体の受信バイト数
	var total:Number  = e.bytesTotal;

	// パーセント
	var percent:Number  = Math.floor(e.bytesLoaded / e.bytesTotal * 100);

	// 出力テスト
	trace("loaded:" + loaded + "Byte");
	trace("total:"  + total + "Byte");
	trace("percent:" + percent + "%");
});

// ------------------------------------------------------------
// HTTP 通信に成功すると実行されるイベント(レスボンス結果の取得可能)
// ------------------------------------------------------------
url_loader.addEventListener( Event.COMPLETE , function (e:Event):void{
	trace("HTTP 通信成功");
});

// ------------------------------------------------------------
// 受信フォーマットを設定
// ------------------------------------------------------------
url_loader.dataFormat = URLLoaderDataFormat.BINARY;

// ------------------------------------------------------------
// URLRequest オブジェクトを作成する
// ------------------------------------------------------------
var url_request:URLRequest = new URLRequest("http://example.com/download/binary.dat");

// ------------------------------------------------------------
// HTTP 通信を開始する
// ------------------------------------------------------------
url_loader.load(url_request);
 

■最終的なリダイレクト先の URL アドレスを取得する(Adobe AIR のみ)

 
responseURL プロパティを使用します。
 
リダイレクトが発生したかを知るには、redirected プロパティを使用します。
 
最終的なリダイレクト先の URL アドレスを取得する(Adobe AIR)

import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.events.HTTPStatusEvent;

// ------------------------------------------------------------
// URLLoader オブジェクトを作成する
// ------------------------------------------------------------
var url_loader:URLLoader = new URLLoader();

// ------------------------------------------------------------
// レスポンスヘッダの受信が完了したときに実行されるイベント(Adobe AIR のみ)
// ------------------------------------------------------------
url_loader.addEventListener( HTTPStatusEvent.HTTP_RESPONSE_STATUS , function (e:HTTPStatusEvent):void{

	// ------------------------------------------------------------
	// 最終的なリダイレクト先の URL アドレスを取得する
	// ------------------------------------------------------------
	var final_url:String = e.responseURL;

	// 出力テスト
	trace( final_url ); // "http://example.com/"

});

// ------------------------------------------------------------
// URLRequest オブジェクトを作成する
// ------------------------------------------------------------
var url_request:URLRequest = new URLRequest("http://t.co/lJ5lPCLZnG");

// ------------------------------------------------------------
// HTTP 通信を開始する
// ------------------------------------------------------------
url_loader.load(url_request);
 

■ファイルのダウンロードについて

 
別途、FileReference クラスを使用します。
 
ファイルをダウンロードする方法については、こちらで解説しています。
 


 

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)
 

 

 

クロスドメイン通信について

 


■クロスドメイン通信について

 
■クロスドメイン通信とは?
 
他サイトとのデータの送受信を実現する事を、クロスドメイン通信といいます。
 
■クロスドメインポリシーによる制限
 
任意の Web ページから、別ドメイン下に格納されているリソースを、読み取りアクセスする事はできません。
 
HTML では「生成元(オリジン)」単位ですが、Flash では「ドメイン」単位です。
 
■ Adobe AIR の場合
 
Adobe AIR では、クロスドメインポリシーによる制限はありません。
 
より高機能で本格的な、HTTP 通信を利用できます。
 

■クロスドメインポリシーの解除について

 
クロスドメインポリシーは、解除できます。
 
■サーバー側の処理について
 
サーバー側に、クロスドメインポリシーファイルを設置します。
 
■ Flash 側の処理について
 
もしサブフォルダにポリシーファイルが設置されている場合、事前に loadPolicyFile() メソッドを実行します。
 
マスターポリシーファイルに限っては、自動的に読み込まれます。
 
マスターポリシーファイルにて解決する場合、loadPolicyFile() メソッドは不要です。
 
 

 

URLRequest クラスについて

 
 


■ URLRequest クラスについて

 
HTTP 通信のリクエスト側に関する設定を行います。
 

■ URLRequest クラスの機能一覧

 
■プロパティ(一部抜粋)
 
プロパティ 説明
url String アクセス先の URL を設定する
method String 「HTTP メソッド」を設定する (URLRequestMethod.*)
requestHeaders Array 「リクエストヘッダ」を設定する(URLRequestHeaderを格納)
contentType String 「リクエストヘッダ」の「コンテンツタイプ」を設定する
data Object 送信したいデータを指定する
 
■プロパティ(Adobe AIR の場合)
 
Adobe AIR では、以下のプロパティも利用できます。
 
プロパティ 説明
userAgent String 「リクエストヘッダ」の「ユーザーエージェント」を設定する
idleTimeout Number タイムアウトエラーが発生するまでの時間を設定する(単位:ミリ秒)
followRedirects Booean リダイレクト検出時に、最終的な移転先まで通信を繰り返すか?
cacheResponse Booean レスポンス結果のキャッシュを試みるか?(falseでキャッシュしない)
authenticate Booean ベーシック認証などの要求に対応するか?(falseで必ずエラー)
 

■ URLRequest オブジェクトを作成する

 
new 演算子を使って、URLRequest クラスをインスタンス化します。
 
new URLRequest ( "URL" ):URLRequest
第01引数(略可)Stringアクセス先の URL を指定する (url プロパティと同等)
戻り値 URLRequestURLRequest オブジェクトが得られる
 
URLRequest オブジェクトを作成する

import flash.net.URLRequest;

// ------------------------------------------------------------
// URLRequest オブジェクトを作成する
// ------------------------------------------------------------
var url_request:URLRequest = new URLRequest("http://example.com/cgi-bin/test.cgi");

// 出力テスト
trace(url_request);
 


 

URLRequestHeader クラスについて

 
 


■ URLRequestHeader クラスについて

 
URLRequestHeader は、リクエストヘッダ1つ分に相当します。
 
 

■ URLRequestHeader クラスの機能一覧

 
■プロパティ
 
プロパティ 説明
name String ヘッダフィールド名を指定
value String 値を指定
 

■ URLRequestHeader オブジェクトを作成する

 
new URLRequestHeader() :URLRequestHeader
第01引数(略可)Stringヘッダフィールド名を指定 (name プロパティと同等)
第02引数(略可)String値を指定 (value プロパティと同等)
戻り値 URLRequestHeaderURLRequestHeader オブジェクトが得られる
 
URLRequestHeader オブジェクトを作成する

import flash.net.URLRequestHeader;

// ------------------------------------------------------------
// URLRequestHeader オブジェクトを作成する
// ------------------------------------------------------------
var request_header:URLRequestHeader = new URLRequestHeader("Content-Type" , "text/plain");

// 出力テスト
trace(header);
 
カスタムリクエストヘッダを送信する

import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLRequestHeader;
import flash.net.URLLoader;

// ------------------------------------------------------------
// URLRequest オブジェクトを作成する
// ------------------------------------------------------------
var url_request:URLRequest = new URLRequest("http://example.com/cgi-bin/test.cgi");

// ------------------------------------------------------------
// 「HTTP メソッド」を設定する
// ------------------------------------------------------------
url_request.method = URLRequestMethod.POST;

// ------------------------------------------------------------
// 「リクエストヘッダ」を設定する
// ------------------------------------------------------------
// URLRequestHeader オブジェクトを作成する
var request_header0:URLRequestHeader = new URLRequestHeader("X-Unknown-0" , "Hello");
var request_header1:URLRequestHeader = new URLRequestHeader("X-Unknown-1" , "World");

// リクエストヘッダのリストを取得する
var request_headers:Array = url_request.requestHeaders;

// URLRequestHeader オブジェクトを追加登録する
request_headers.push(request_header0);
request_headers.push(request_header1);

// ------------------------------------------------------------
// リクエストの「コンテンツタイプ」を設定する
// ------------------------------------------------------------
url_request.contentType = "text/plain";

// ------------------------------------------------------------
// 「送信したいデータ」を指定する
// ------------------------------------------------------------
url_request.data = "Send Test !!";

// ------------------------------------------------------------
// HTTP 通信を開始する
// ------------------------------------------------------------
// URLLoader オブジェクトを作成する
var url_loader:URLLoader = new URLLoader();

// HTTP 通信を開始する
url_loader.load(url_request);
 


 

URLVariables クラスについて

 
 


■ URLVariables クラスについて

 
URLVariables クラスは、「x-www-form-urlencoded 文字列」と「連想配列」を相互変換します。
 
URLVariables オブジェクト自身は、連想配列としても動作します。
 

■ URLVariables クラスの機能一覧

 
■メソッド
 
メソッド 説明
decode() 「x-www-form-urlencoded 文字列」から「連想配列」に変換する
toString() 「連想配列」から「x-www-form-urlencoded 文字列」を出力する
 

■ URLVariables オブジェクトを作成する

 
new URLVariables( source ) :URLVariables
第01引数(略可)String「x-www-form-urlencoded 文字列」を指定して「連想配列」に変換する
戻り値 URLVariablesURLVariables オブジェクトが得られる
 
空の URLVariables オブジェクトを作成する

import flash.net.URLVariables;

// ------------------------------------------------------------
// 空の URLVariables オブジェクトを作成する
// ------------------------------------------------------------
var url_variables:URLVariables = new URLVariables();

// 出力テスト
trace(url_variables);
 
デコードしつつ URLVariables オブジェクトを作成する

import flash.net.URLVariables;

// ------------------------------------------------------------
// URLVariables オブジェクトを作成する
// ------------------------------------------------------------
var url_variables:URLVariables = new URLVariables( "user=taro&age=18&blood=b" );

// 出力テスト
trace(url_variables["user"]);  // "taro"
trace(url_variables["age"]);   // "18"
trace(url_variables["blood"]); // "b"
 

■「x-www-form-urlencoded 文字列」から「連想配列」に変換する

 
decode() メソッドを使用します。
 
URLVariables オブジェクトは、連想配列です。
 
デコード後、プロパティが追加され、値情報が格納されています。
 
for..in 文を使用すると、すべてのデータに順番にアクセスできます。
 
URLVariables.decode ( source ) :void
第01引数(略可)String「x-www-form-urlencoded 文字列」を指定して「連想配列」に変換する
戻り値 voidなし
 
「x-www-form-urlencoded 文字列」から「連想配列」に変換する

import flash.net.URLVariables;

// ------------------------------------------------------------
// 「x-www-form-urlencoded 文字列」を用意する
// ------------------------------------------------------------
var url_encoded = "user=taro&age=18&blood=b";

// ------------------------------------------------------------
// URLVariables オブジェクトを作成する
// ------------------------------------------------------------
var url_variables:URLVariables = new URLVariables();

// ------------------------------------------------------------
// 「x-www-form-urlencoded 文字列」から「連想配列」に変換する
// ------------------------------------------------------------
url_variables.decode(url_encoded);

// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
trace(url_variables["user"]);  // "taro"
trace(url_variables["age"]);   // "18"
trace(url_variables["blood"]); // "b"

// ------------------------------------------------------------
// 順番にアクセスする
// ------------------------------------------------------------
var key:String;
var value:String;
for(key in url_variables){

	// 値情報を取得する
	value = url_variables[key];

	// 出力テスト
	trace(key,value);
}
 

■「連想配列」から「x-www-form-urlencoded 文字列」を出力する

 
toString() メソッドを使用します。
 
URLVariables オブジェクトは、連想配列です。
 
あらかじめ、プロパティを追加し、値情報を格納しておきます。
 
URLVariables.toString ( ) :void
引数 voidなし
戻り値 String「x-www-form-urlencoded 文字列」が得られる
 
「x-www-form-urlencoded 文字列」から「連想配列」に変換する

import flash.net.URLVariables;

// ------------------------------------------------------------
// URLVariables オブジェクトを作成する
// ------------------------------------------------------------
var url_variables:URLVariables = new URLVariables();

// ------------------------------------------------------------
// 「名前と値情報」を追加する
// ------------------------------------------------------------
url_variables["user"] = "taro";
url_variables["age"] = "18";
url_variables["blood"] = "b";

// ------------------------------------------------------------
// 「連想配列」から「x-www-form-urlencoded 文字列」に変換する
// ------------------------------------------------------------
var url_encoded:String = url_variables.toString();

// 出力テスト
trace(url_encoded); // "user=taro&age=18&blood=b"
 


 

HTTPStatusEvent クラスについて

 


■ HTTPStatusEvent クラスのプロパティ一覧

 
■Flash Player 版
 
プロパティ 説明
status Number HTTP ステータスコードを取得する
 
■Adobe AIR 版
 
Adobe AIR では、さらに以下の種類があります。
 
プロパティ 説明
responseHeaders Array レスポンスヘッダをまとめて取得する(中身はURLRequestHeader
redirected Number リダイレクトが発生したか?
responseURL String 最終的なリダイレクト先の URL アドレスを取得する