flash9/flash cs3(as3)通过soap访问Web Services (.net)

  1 flash9 / flash cs3(as3)通过soap访问Web Services 
  2 来源:Roading ' s blog 作者:roading 2007-07-17 【大 中小】 
  3
  4 下面是as3访问Web Services的原理和过程,包括实例和源文件,已经经过了测试(http: // www.roading.net/WebService/as3_soap.swf)
  5
  6 前段时间写了 使用flash9(as3)连接webservice,结果发现这种以http post方法访问WebServices只能在测试环境下使用.然后就写了flash9 / as3访问WebService的暂时替代方法,当然这是无奈之举,找不到合适的方法前先使用中转的方法来代替.
  7
  8 但是还是需要找到真正的解决方法,昨天在翻看flash8的mx\services包的时候,在包里面的SOAPCall和PendingCall类里面有整个的访问方法.
  9
 10 在SOAPCall类里面有request和response两个对象,分别是提交数据和返回数据.
 11
 12 下面是节选SOAPCall类的asyncInvoke方法的一部分,实现request的构造和数据发送(这里是流程,具体实现细节在PendingCall类里面):
 13
 14
 15 // callback是PendingCall的实例. 
 16 callback.encode(); 
 17
 18 callback.callbackMethod  =  callbackMethod;  //  Callback method 
 19
 20 //  Populate parameters 
 21 callback.setupParams(args); 
 22
 23 //  prepare response object 
 24 var response  =   new  XML(); 
 25 response.ignoreWhite  =   true
 26 response.callback  =  callback; 
 27 response._startTimeMark  =  startTime; 
 28
 29
 30 callback.response  =  response; 
 31
 32 //  create the async response mechanism 
 33 response.onData  =  function(src) 
 34
 35}
 
 36 //  fire message 
 37 callback.request.sendAndLoad( this .endpointURI, response,  " POST " ); 
 38 // ------------------------------------------------------------------------------------------- 
 39
 40
 41 看到上面的代码,就会豁然开朗,就是使用soap协议,来提交和获取数据.那么,我们就可以很简单的构成一个SOAP 请求.我们看一下soap请求的格式(http: // roading.net/WebService/test.asmx?op=say):
 42 下面是一个 SOAP 请求和响应示例。所显示的占位符需要由实际值替换。
 43
 44
 45 POST  / WebService / test.asmx HTTP / 1.1  
 46 Host: roading.net 
 47 Content - Type: text / xml; charset = utf - 8  
 48 Content - Length: length 
 49 SOAPAction:  " http://www.roading.net/say "  
 50
 51 <? xml version = " 1.0 "  encoding = " utf-8 " ?>  
 52 < soap:Envelope xmlns:xsi = " http://www.w3.org/2001/XMLSchema-instance "  xmlns:xsd = " http://www.w3.org/2001/XMLSchema "  xmlns:soap = " http://schemas.xmlsoap.org/soap/envelope/ " >  
 53 < soap:Body >  
 54 < say xmlns = " http://www.roading.net/ " >  
 55 < str > string </ str >  
 56 </ say >  
 57 </ soap:Body >  
 58 </ soap:Envelope >  
 59
 60
 61 一个soap请求包括头部和数据.
 62 soap请求头部包括:
 63
 64
 65 POST  / WebService / test.asmx HTTP / 1.1  
 66 Host: roading.net 
 67 Content - Type: text / xml; charset = utf - 8  
 68 Content - Length: length 
 69 SOAPAction: http: // www.roading.net/say 
 70
 71
 72 URLRequestHeader不支持post,host和Content - Length(ArgumentError: Error # 2096 : HTTP 请求标头 host 不能通过 ActionScript 设置。),同时也不必要,必须设置的是Content - Type和SOAPAction.
 73
 74
 75 //  
 76 r.requestHeaders.push( new  URLRequestHeader( " Content-Type " " text/xml;charset=utf-8 " )); 
 77 r.requestHeaders.push( new  URLRequestHeader( " SOAPAction " " http://www.roading.net/say " )); 
 78 //  
 79
 80
 81 soap请求数据为:
 82
 83
 84 < soap:Envelope xmlns:xsi = " http://www.w3.org/2001/XMLSchema-instance "  xmlns:xsd = " http://www.w3.org/2001/XMLSchema "  xmlns:soap = " http://schemas.xmlsoap.org/soap/envelope/ " >  
 85   < say xmlns = " http://www.roading.net/ " >   // 调用方法.. 命名空间 
 86    < str > hello </ str >   // 参数 
 87   </ say >  
 88 </ soap:Envelope >  
 89
 90
 91 整个的soap请求如上面所示就可以使用URLLoader和URLRequest类来发送和接收数据了.下面是一个完整的调用WebServices的测试代码(不包括解析接收的数据):
 92
 93
 94 // WebService网址(为测试写的例子)  http://www.roading.net/WebService/test.asmx  
 95 import  flash.net. *
 96 var soap:Namespace  =   new  Namespace( " http://schemas.xmlsoap.org/soap/envelope/ " ); 
 97
 98 var r:URLRequest  =   new  URLRequest( " http://www.roading.net/WebService/Test.asmx?op=say " ); 
 99 r.method  =  URLRequestMethod.POST; 
100 r.requestHeaders.push( new  URLRequestHeader( " Content-Type " " text/xml;charset=utf-8 " )); 
101 r.requestHeaders.push( new  URLRequestHeader( " SOAPAction " " http://www.roading.net/say " )); 
102
103
104 var rXML:XML  =   
105      < soap:Envelope xmlns:xsi = " http://www.w3.org/2001/XMLSchema-instance "  xmlns:xsd = " http://www.w3.org/2001/XMLSchema "  xmlns:soap = " http://schemas.xmlsoap.org/soap/envelope/ " >  
106       < soap:Body />  
107      </ soap:Envelope >  
108     ; 
109     
110 rXML.soap::Body.appendChild( 
111   < say xmlns = " http://www.roading.net/ " >   //  
112    < str > hello </ str >   //  
113   </ say >  
114 ); 
115
116 r.data  =  rXML; 
117
118 var l:URLLoader  =   new  URLLoader(); 
119 l.dataFormat  =  URLLoaderDataFormat.TEXT; 
120 l.load(r); 
121
122 l.addEventListener( " ioError "  ,err); 
123 l.addEventListener(Event.COMPLETE,xmlLoaded); 
124 function xmlLoaded(d) 
125
126 trace(l.data); 
127 t.text = l.data; 
128}
 
129
130 function err(e) 
131
132 trace(e); 
133}
 
134

转载于:https://www.cnblogs.com/wubiyu/archive/2008/07/09/1239584.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值