Flex提供MXML來(lái)描述一個(gè)HTTPService,看上可以簡(jiǎn)化開(kāi)發(fā)人員的工作,但實(shí)際上這種描述HTTPService的方式很容易產(chǎn)生重復(fù)代碼導(dǎo)致代碼不好維護(hù)和擴(kuò)展。數(shù)據(jù)交互接口唯一定義對(duì)系統(tǒng)的維護(hù)非常有利,但基于AS定義HTTPService也是一件煩瑣的事情;那如何做才能夠達(dá)到方便地定義接口呢。
接口定義
以下是定義一個(gè)登陸的HTTPService
public class ILogin extends HttpBase
{
public function ILogin(method:String="get", result:Function=null)
{
super("userlogin", method, result);
}
public var UserName:String;
public var UserPWD:String;
public var ImgSN:String;
public var ImgKey:String;
}
看上非常簡(jiǎn)單,只需要繼承HttpBase然后效需要提交的參數(shù)定義成Public成員即可以。對(duì)于構(gòu)造函數(shù)參數(shù)下介紹HttpBase的時(shí)候講述;對(duì)于這個(gè)接口又是怎樣調(diào)用的呢。
var send:ILogin =new ILogin( "get",function(data:XML,error:Boolean){
if(!error)
{
}
});
send.UserName= txtName.text;
send.UserPWD=txtPWD.text;
send.ImgKey= ic.ImageKey();
send.ImgSN=ic.ImageSN();
send.Open();
如果并不想考慮太多處理,只關(guān)心登陸處理可以這樣定義。
var send:ILogin =new ILogin();
send.UserName= txtName.text;
send.UserPWD=txtPWD.text;
send.ImgKey= ic.ImageKey();
send.ImgSN=ic.ImageSN();
send.Open();
服務(wù)端代碼
對(duì)于服務(wù)端代碼就可以根據(jù)自己需來(lái)處理,jsp,asp,asp.net,php都是一樣只要接收http請(qǐng)求即可。為了便于理解把服務(wù)端代碼順便貼出來(lái):
[NClay.Web.Service.ActionMapper]
public class UserLogin : ActionBase
{
protected override void OnGet()
{
ImageValidate.Check();
User user= _UserService.Login(UserName, UserPWD);
if(user ==null)
throw new Exception("用戶名或密碼不正確!");
if (user != null && !user.Enabled)
throw new Exception("用戶已經(jīng)被系統(tǒng)禁用,請(qǐng)與管理員聯(lián)系!");
mLoginer = user;
mIsLogin = mLoginer != null;
FormsAuthentication.SetAuthCookie(Loginer.UserName, true);
LoginID = Loginer.UserID;
LoginName = Loginer.UserName;
base.OnGet();
}
public string UserName
{
get;
set;
}|||
public string UserPWD
{
get;
set;
}
[NClay.Web.Service.OutputXml]
public int LoginID
{
get;
set;
}
[NClay.Web.Service.OutputXml]
public string LoginName
{
get;
set;
}
public NClay.Web.Actions.ImageValidate ImageValidate
{
get;
set;
}
}
HttpBase的定義
該HttpBase是針對(duì)本人現(xiàn)有需求所制定的,所以并不一定適合你的需要;但作為一個(gè)參考
public class HttpBase
{
private var mService:HTTPService=null
private var mResult:Function=null;
private var mFristSearch:Boolean=false;
public var _TimeSlice:Date;
public function GetService():HTTPService
{
return mService;
}
public function HttpBase(api:String,method:String="get",result:Function=null)
{
mService = new HTTPService();
mService.useProxy=false;
mService.url=GetServiceUrl()+api;
mService.resultFormat="e4x";
mService.method=method;
mService.addEventListener(FaultEvent.FAULT,HFSoftCoreFun.onFault);
mService.addEventListener(ResultEvent.RESULT,OnResult);
mResult=result;
}
protected virtual function GetServiceUrl():String
{
return "service.aspx?do=";
}
private function OnResult(event:ResultEvent)
{
var data:XML=XML(event.result);
var iserror:Boolean=HFSoftFx.HFSoftCoreFun.IsError(data);
if(mResult!=null)
mResult(data,iserror);
}
public function get FirstSearch():Boolean
{
return mFristSearch;
}
public function Open(firstSearch:Boolean=false)
{
_TimeSlice =new Date();
mFristSearch=firstSearch;
mService.send(this);
}
}代碼也非常簡(jiǎn)單,就是在httpservice的基礎(chǔ)上包裝一下。其實(shí)了解AS的朋友應(yīng)該可以看得出對(duì)于動(dòng)態(tài)語(yǔ)言來(lái)說(shuō)直接把HttpBase定義成動(dòng)態(tài)類,然后直接設(shè)置成員提交這樣就省下每個(gè)交互都定義一個(gè)類型出來(lái)這么麻煩。但作為一個(gè)服務(wù)接口調(diào)用成員越明確越好,因?yàn)槌绦蚴且?jīng)常修改和維護(hù)的;不過(guò)是不是要這樣做就是團(tuán)隊(duì)約束規(guī)范問(wèn)題了。