转:Flex中如何打开网页及Get/Post数据

ash终究只是客户端技术,所以很多时候还是需要与服务端技术(比如asp,asp.net,jsp,php之类)进行数据交互的,下面的代码演示了如何在flash中打开网页,以及用GET/POST二种方式向服务端发送数据

01 //按下按钮,打开网页
02 btnOpen.addEventListener(MouseEvent.CLICK,
03  function(){
04  navigateToURL(new URLRequest("http://www.g.cn/search?hl=zh-CN&q=" + encodeURIComponent(txtId.text)),"_blank");
05 });
06  
07 //以Get方式发送数据(发送就完事,不会理会服务端是否响应)
08 btnSend.addEventListener(MouseEvent.CLICK,
09  function(){
10  sendToURL(new URLRequest("/default.aspx?q=" + encodeURIComponent(txtId.text)));
11 });
12 btnPost.addEventListener(MouseEvent.CLICK,fnPostData);
13  
14 //以Post方式发送数据(同样:发送就完事,不会理会服务端是否响应)
15 function fnPostData(e:MouseEvent) {
16  var _urlReq:URLRequest = new URLRequest();
17  _urlReq.url = "/default.aspx";
18  _urlReq.method = URLRequestMethod.POST;
19  var _data:URLVariables = new URLVariables();
20  _data.q = "菩提树下的杨过"; //即传递 q = 菩提树下的杨过,注:经测试,Flash会自动对传递的数据做encodeURIComponent处理,所以此外不能再加encodeURIComponent,否则就是二次编码了
21  _urlReq.data = _data;
22  sendToURL(_urlReq);
23 }

 

 

1 protected void Page_Load(object sender, EventArgs e)
2 {
3  string q = Request["q"];
4  if (!string.IsNullOrEmpty(q)) {
5   string _file = Server.MapPath("~/log.txt");
6   File.AppendAllText(_file,q + "\t" + Request.HttpMethod + "\t" + DateTime.Now + Environment.NewLine);
7  }
8 }

如果发送了数据后,还要响应服务端的结果(比如取得服务端的返回值,再继续到Flash中处理),Flash中可这样写:

01 var loader:URLLoader = new URLLoader();
02 configureListeners(loader);
03 var request:URLRequest=new URLRequest("/FlashHander.ashx?q=" + encodeURIComponent("菩提树下的杨过"));
04 try {
05  loader.load(request);
06 } catch (error:Error) {
07  trace("Unable to load requested document.");
08 }
09  
10 //定义各种情况的回调函数
11 function configureListeners(dispatcher:IEventDispatcher):void {
12  dispatcher.addEventListener(Event.COMPLETE, completeHandler);
13  dispatcher.addEventListener(Event.OPEN, openHandler);
14  dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler);
15  dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
16  dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
17  dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
18 }
19  
20 //加载完成时,将触发
21 function completeHandler(event:Event):void {
22  var loader:URLLoader=URLLoader(event.target);
23  trace("completeHandler: " + loader.data);
24  lblReceive.text = loader.data; //本例中,服务端返回: msg=Hello World&Method=GET&q=菩提树下的杨过
25  var vars:URLVariables=new URLVariables(loader.data);
26  trace("The Method is " + vars.Method); //服务端返回的字符串中如果有 Method=xxx 这样的字符,则Flash中可以直接用vars.Method进行访问
27 }
28  
29 //刚开始请求时,将触发
30 function openHandler(event:Event):void {
31  trace("openHandler: " + event);
32 }
33  
34 //下载进度发生变化时,将触发(可利用这个做加载进度条)
35 function progressHandler(event:ProgressEvent):void {
36  trace("progressHandler loaded:" + event.bytesLoaded + " total: " + event.bytesTotal);
37 }
38  
39 //因安全原因出现错误时,将触发
40 function securityErrorHandler(event:SecurityErrorEvent):void {
41  trace("securityErrorHandler: " + event);
42 }
43  
44 //http请求状态变化时,将触发
45 function httpStatusHandler(event:HTTPStatusEvent):void {
46  trace("httpStatusHandler: " + event);
47 }
48  
49 //io错误时,将触发
50 function ioErrorHandler(event:IOErrorEvent):void {
51  trace("ioErrorHandler: " + event);
52 }


服务端FlashHander.ashx可以这样处理:
注意:返回的字符串格式为 name1=value1&name2=value2&name3=value3... 如果name和value中本身包含"="与"&",请注意用其它字符替换掉

01 /// <summary>
02 /// Summary description for FlashHander
03 /// </summary>
04 public class FlashHander : IHttpHandler
05 {
06  public void ProcessRequest(HttpContext context)
07  {
08   context.Response.ContentType = "text/plain";
09   context.Response.Write("msg=Hello World&Method=" + context.Request.HttpMethod + "&q=" + context.Request["q"]);
10  }
11  public bool IsReusable
12  {
13   get
14   {
15     return false;
16   }
17  }
18 }

 

服务端可以这样处理:

posted @ 2010-12-06 12:42  魔豆  阅读(3650)  评论(0编辑  收藏  举报