在Flash應用開發中,經常需要用到和Web伺服器端的通訊,把當前的應用程式狀態儲存到伺服器上或者從伺服器端擷取資訊等等。對於Flash來說,他已經提供了對Http協議和網路通訊端(Socket)的支援。對於Http協議的支援,Flash通過URLRequest、URLLoader、URLVariables等類來完成操作。
1、Flash中擷取外部圖片等資源
在ActionScript3中,擷取外部資源主要通過URLRequest和URLLoader兩個類完成,可以通過註冊URLLoader類的Complete和Progress等事件來監控擷取外部資源的狀態。
var myLoader:URLLoader=new URLLoader();var myXmlLocation:URLRequest = new URLRequest("test.xml");myLoader.load(myXmlLocation);myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,xmlLoadComplete);
如果我們擷取的外部資源是二進位形式的,我們需要使用Loader類來代替URLLoader類。
2、Flash中的資訊傳輸給Web伺服器
在Flash中需要把資料傳遞給Web伺服器,我們只能通過POST或者GET進行,POST動作相對於GET可以傳遞更多的資料,具體區別在於Http的entity body,對於POST來說,發送的值就在entity body中,對於GET來說,entity body永遠為空白。對於HTML表單,可以在Form的Method中指明當前傳遞資料是POST還是GET,但是Flash中,需要在URLRequest對像中指明當前的操作是POST還是GET。在Flash中,當需要給Web伺服器傳遞資料時,需要URLRequest,URLVariables,URLLoader等三個類來完成。
var values:URLVariables =new URLVariables(); values.key=”Message”; var header:URLRequestHeader = new URLRequestHeader("pragma", "no-cache"); var request:URLRequest=new URLRequest("http://localhost/shopguide/data.php"); request.data=values; request.requestHeaders.push(header); request.method=URLRequestMethod.POST; var loader:URLLoader=new URLLoader(); try { loader.load(request); } catch (error:ArgumentError) { trace("An ArgumentError has occurred."); } catch (error:SecurityError) { trace("A SecurityError has occurred."); }
上面的代碼,利用URLVariables構造出要傳遞資料的索引值對,這樣在PHP端,就可以通過$_POST[“key”]來擷取傳遞的資料。代碼中的URLRequestHeadere是一個Http要求標頭,即使應用程式具有所請求內容的快取複本,也應當將請求轉寄給原始伺服器。下面的圖是在IE9的開發人員工具下看到的請求資訊。
在PHP服務端,我們只需要echo($_POST['key']);就可以擷取到請求的資訊,第三幅圖的響應本文就是PHP中echo輸出的資訊。
3、使用php://input擷取沒有指定索引值對的Flash請求的內容
在《ACTIONSCRIPT 3.0編程》這本書中,他給出的一個傳遞XML的到Web伺服器的例子並沒有使用URLVariables類來構建索引值對,範例程式碼如下:
var secondsUTC:Number = new Date().time;var dataXML:XML = {secondsUTC} Ernie guru ;var request:URLRequest = new URLRequest("http://localhost/shopguide/data.php");request.contentType = "text/xml";request.data = dataXML.toXMLString();request.method = URLRequestMethod.POST;var loader:URLLoader = new URLLoader();try{ loader.load(request);}catch (error:ArgumentError){ trace("An ArgumentError has occurred.");}catch (error:SecurityError){ trace("A SecurityError has occurred.");}
這個代碼發送的請求與使用URLVariables類的差異在於請求的內容直接是發送的內容,就是沒有索引值,請求的內容如下:
像這樣的請求如何在PHP中取得資料?後來查資料得知,可以通過PHP的file_get_contents("php://input")擷取。在PHP中,file_get_contents返回的是一個字串。通過輸出file_get_contents的內容我們可以看到如下響應本文。
關於php://input,請參考這篇文章:
php://input是什麼意思?php輸入資料流input的介紹
ActionsScript3中還提供了Socket類和XMLSocket類,具體使用可以參考《 ACTIONSCRIPT 3.0編程》這本書。