当前位置: 首页 > 科技观察

WebAPI接口设计经验总结

时间:2023-03-12 06:30:45 科技观察

在WebAPI接口的开发过程中,我们可能会遇到各种各样的问题。我在前面的两篇随笔《Web API应用架构在Winform混合框架中的应用(1)》和《Web API应用架构在Winform混合框架中的应用(2)--自定义异常结果的处理》也做了大概的介绍。经过自己大量的模块实践和成功运行,总结了这篇随笔,希望对大家有所帮助。1.在接口定义中确定MVC的GET或POST方法由于我们整个WebAPI平台都是基于MVC的API开发,所以一般需要显示整个WebAPI的接口声明接口是[HttpGet]或者[HttpPost],虽然有些接口不需要声明,但是为了避免像下面这样的错误信息,显式声明还是有好处的。例如,基类中定义的查找对象接口如下所示。///

///查询数据库是否存在指定ID的对象//////对象的ID值///如果存在则返回指定对象,否则返回Null[HttpGet]publicvirtualTFindByID(stringid,stringtoken)如果是增删改查的接口,一般需要声明为POST提交数据,基于安全考虑,需要携带更多的信息参数。//////将指定对象插入数据库//////指定对象///操作是否成功.[HttpPost]publicvirtualCommonResultInsert(Tinfo,stringtoken,stringsignature,stringtimestamp,stringnonce,stringappid)2.动态对象的接口定义在通用WebAPI接口中。我们可能会遇到很多简单类型的参数,但是我们想让它们以POST的形式提交数据,那么我们可以有两种方式来处理,一种是定义一个类来放置这些参数,另一种是使用动态JObject参数,前者有很多不便之处,因为我们不可能为每个接口参数多定义一个实体类,所以可能会有很多难以管理的类定义。比如下面是微信API调用接口的例子,我们也需要设置这样的处理规则。接口调用请求说明http请求方式:POST(请使用https协议)https://api.weixin.qq.com/cgi-bin/groups/update?access_token=ACCESS_TOKENPOST数据格式:jsonPOST数据示例:{"group":{"id":108,"name":"test2_modify2"}}那么我们就这样使用JObject,我们来看一下接口的定义和处理代码。JObject是Newtonsoft.Json.Linq命名空间下的一个对象。//////修改用户密码//////包含用户名和用户密码的复合对象///用户accesstoken///[HttpPost]publicCommonResultModifyPassword(JObjectparam,stringtoken){//token校验,失败则抛出异常CheckResultcheckResult=CheckToken(token);dynamicobj=param;if(obj!=null){stringuserName=obj.userName;stringuserPassword=obj.userPassword;boolsuccess=BLLFactory.Instance.ModifyPassword(userName,userPassword);returnnewCommonResult(成功);}else{thrownewMyApiException("传递参数发生错误");}}当我们将JObject对象转换为我们需要的对象时,由于我们还没有定义具体的实体类,所以我们使用动态语法声明这是一个动态对象,得到对应的对象通过运行时属性。动态对象=参数;这样我们就可以在调用的时候动态POST对应的JSON对象到WebAPI接口,而不需要预先定义各种接口参数的类。//////调用WebAPI接口,修改用户密码//////用户名///修改密码///如果修改成功,返回true,否则返回falsepublicboolModifyPassword(stringuserName,stringuserPassword){varaction="ModifyPassword";varpostData=new{userName=userName,userPassword=userPassword}.ToJson();stringurl=GetTokenUrl(action);CommonResultresult=JsonHelper.ConvertJson(url,postData);return(result!=null)?result.Success:false;}其中GetTokenUrl是基于token和API地址等参数构造完整的提交地址。我们可以通过varpostData=new{userName=userName,userPassword=userPassword}.ToJson();动态创建一个对象上述代码中,生成其JSON字符串,并将数据POST提交到相应的API接口,然后将结果转换为一个对象,就大功告成了。3、采集和分页处理在很多接口中,我们都需要用到分页处理,WebAPI也不例外。这样可以提高数据检索效率,减轻服务器数据处理的压力,也可以加快客户端提交数据的显示速度。通用集合接口定义如下(genericbaseclassinterface)。//////返回数据库中所有对象集合//////指定对象的集合[HttpGet]publicvirtualListGetAll(stringtoken){//检查用户是否有权限,否则抛出MyDenyAccessExceptionbase.CheckAuthorized(AuthorizeKey.ListKey,token);Listlist=baseBLL.GetAll();returnlist;}但是这样的返回记录会比较多,一般需要Paging,那么分页的处理接口定义如下。//////根据条件查询数据库,返回对象集合(用于分页数据展示)//////指定对象的集合[HttpPost]publicvirtualPagedListFindWithPager(stringcondition,PagerInfopagerInfo,stringtoken)分页接口,这里返回的结果中使用了一个PageList泛型类,方便我们获取当前记录和总数,其定义如下如下。//////分页集合//////objectpublicclassPagedList{//////返回记录总数///publicinttotal_count{get;set;}//////列表集合///publicListlist{get;set;}}***整个页面处理WebAPI接口的实现如下所示。//////根据条件查询数据库,返回对象集合(用于分页数据展示)//////指定对象的集合[HttpPost]publicvirtualPagedListFindWithPager(stringcondition,PagerInfopagerInfo,stringtoken){//检查用户是否有权限,否则抛出MyDenyAccessExceptionbase.CheckAuthorized(AuthorizeKey.ListKey,token);Listlist=baseBLL.FindWithPager(condition,pagerInfo);//构造成Json格式传递varresult=newPagedList(){total_count=pagerInfo.RecordCount,list=list};returnresult;}***客户端调用分页的WebAPI代码如下。//////根据条件查询数据库,返回对象集合(用于分页数据展示)//////查询条件///分页实体///指定对象的集合publicvirtualListFindWithPager(stringcondition,refPagerInfopagerInfo){varaction="FindWithPager";stringurl=GetTokenUrl(action)+string.Format("&condition={0}",condition);varpostData=pagerInfo.ToJson();Listresult=newList();PagedListlist=JsonHelper>.ConvertJson(url,postData);if(list!=null){pagerInfo.RecordCount=list.total_count;//修改记录总数result=list.list;}returnresult;}4.Hybrid框架接口集成WebAPI在整个WebAPI平台的接口构建和混合框架的集成过程中,我都是相对独立的开发和集成各个模块。它们实现了直接访问数据库、通过WCF服务获取数据、通过WebAPI调用几种方式获取数据的统一,从而实现了整个混合框架的高度集成。整个混合框架的核心是将各种可复用的模块以相对独立的方式集成在一起,我们可以在一定的基础上快速构建统一的应用平台。已经搭建好的整个WebAPI平台包括服务端内容,并以API控制器的形式发布对应的WebAPI接口。在混合框架的各个独立模块中,我们封装了相应的WebAPI客户端调用处理,从而实现了WebAPI的调用方法。Win10下,使用WebAPI方式运行混合框架,得到的主界面效果如下。独立模块权限管理系统界面如下图所示。<