Flex提供MXML来描述一个HTTPService,看上可以简化开发人员的工作,但实际上这种描述HTTPService的方式很容易产生重复代码导致代码不好维护和扩展。数据交互接口唯一定义对系统的维护非常有利,但基于AS定义HTTPService也是一件烦琐的事情;那如何做才能够达到方便地定义接口呢。
接口定义
以下是定义一个登陆的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;
}
看上非常简单,只需要继承HttpBase然后效需要提交的参数定义成Public成员即可以。对于构造函数参数下介绍HttpBase的时候讲述;对于这个接口又是怎样调用的呢。
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();
如果并不想考虑太多处理,只关心登陆处理可以这样定义
var send:ILogin =new ILogin();
send.UserName= txtName.text;
send.UserPWD=txtPWD.text;
send.ImgKey= ic.ImageKey();
send.ImgSN=ic.ImageSN();
send.Open();
服务端代码
对于服务端代码就可以根据自己需来处理,jsp,asp,ASP.NET,php都是一样只要接收http请求即可。为了便于理解把服务端代码顺便贴出来:
[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("用户已经被系统禁用,请与管理员联系!");
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是针对本人现有需求所制定的,所以并不一定适合你的需要;但作为一个参考
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);
}
}
代码也非常简单,就是在httpservice的基础上包装一下。其实了解AS的朋友应该可以看得出对于动态语言来说直接把HttpBase定义成动态类,然后直接设置成员提交这样就省下每个交互都定义一个类型出来这么麻烦。但作为一个服务接口调用成员越明确越好,因为程序是要经常修改和维护的;不过是不是要这样做就是团队约束规范问题了。