Flash と CGI との連携について
・ | Flash からリクエストを送信する |
・ | URLLoader クラスについて |
・ | Flash 側のデータ送信処理について |
・ | Flash 側のデータ受信処理について |
・ | CGI 側のデータ送受信処理について |
・ | クロスドメイン通信について |
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 | * | 受信したレスポンスボディの内容を取得する |
■メソッド
■イベント
イベントタイプ | 型 | 説明 |
OPEN | Event | (1) HTTP 通信を開始した |
HTTP_RESPONSE_ | HTTPStatusEvent | (2) レスポンスヘッダの受信は完了した |
PROGRESS | ProgressEvent | (3) レスポンスボディを受信中 |
HTTP_STATUS | HTTPStatusEvent | (4) HTTP 通信が完了した(成功失敗に関わらず) |
イベントタイプ | 型 | 説明 |
COMPLETE | Event | HTTP 通信に成功した(レスボンスの取得可) |
IO_ERROR | IOErrorEvent | HTTP 通信に失敗した |
SECURITY_ERROR | SecurityErrorEvent | HTTP 通信に失敗した(セキュリティ関連) |
■ URLLoader オブジェクトを作成する
new 演算子を使って、URLLoader クラスをインスタンス化します。
new URLLoader ( request ):URLLoader
第01引数(略可) | URLRequest | URLRequest オブジェクトを指定 |
戻り値 | URLLoader | URLLoader オブジェクトが得られる |
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 メソッド |
URLRequestMethod. | "POST" | POST メソッド |
■ Adobe AIR 版の場合
Adobe AIR では、さらに以下の種類があります。
定数 | 文字列 | 説明 |
URLRequestMethod. | "HEAD" | HEAD メソッド |
URLRequestMethod. | "OPTIONS" | OPTIONS メソッド |
URLRequestMethod. | "DELETE" | DELETE メソッド |
URLRequestMethod. | "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引数 | URLRequest | URLRequest オブジェクトを指定 |
戻り値 | 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 | なし |
■ファイルのアップロードについて
Flash 側のデータ受信処理について
■ HTTP 通信の状態を調べる
HTTP 通信の状態を取得するには、以下のイベントを使用します。
HTTP_RESPONSE_STATUS イベントは、Adobe AIR のみです。
イベントタイプ | 型 | 説明 |
OPEN | Event | (1) HTTP 通信を開始した |
HTTP_RESPONSE_ | 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 ステータスコードを取得する
HTTPStatusEvent オブジェクトの、status プロパティから取得します。
0 が得られる場合、HTTP 通信は失敗しています。
0 以外が得られる場合、HTTP 通信は成功しています。
HTTP 通信に成功しているからといって、リクエストが成功しているとは限りません。
サーバーからエラーコードが得られる場合があります。 (404、500、503 など)
■サーバへのリクエストが成功したか調べる
status プロパティが 200 である場合、リクエストに成功しています。
他には、2xx や 304 なども、リクエストの成功を意味します。
■ 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 イベントを使用します。
■レスポンスヘッダを取得する
中には、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" | テキストとして受信する。 | String |
URLLoaderDataFormat. | "binary" | バイナリとして受信する。 | ByteArray |
URLLoaderDataFormat. | "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);
■ファイルのダウンロードについて
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() メソッドを実行します。
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 プロパティと同等) |
戻り値 | URLRequest | URLRequest オブジェクトが得られる |
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 プロパティと同等) |
戻り値 | URLRequestHeader | URLRequestHeader オブジェクトが得られる |
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 文字列」を指定して「連想配列」に変換する |
戻り値 | URLVariables | URLVariables オブジェクトが得られる |
空の 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 アドレスを取得する |