95992828九五至尊2

882828九五至尊手机版API接口设计经验计算

二月 21st, 2019  |  882828九五至尊手机版

在Web
API接口的支付进度中,我们或者会碰到各类种种的难题,作者在头里两篇小说《Web
API应用架构在Winform混合框架中的应用(1)
》、《Web
API应用架构在Winform混合框架中的应用(2)–自定义非常结果的处理
》也开展了总的介绍,在经过作者的大气模块实践并成功运营后,统计了那篇小说,希望对大家持有协助。

在Web
API接口的支出进度中,咱们兴许会境遇种种各种的难点,小编在后边两篇小说《Web
API应用架构在Winform混合框架中的应用(1)
》、《Web
API应用架构在Winform混合框架中的应用(2)–自定义相当结果的拍卖
》也进行了总的介绍,在经过自家的豁达模块实践并成功运转后,计算了那篇小说,希望对大家有所帮助。

一 、在接口定义中鲜明MVC的GET只怕POST格局

出于我们全部Web API平台是基于MVC的根基上进展的API开发,由此全部Web
API的接口,在概念的时候,一般须求出示来声称接口是[HttpGet]或者[HttpPost],尽管某个接口也足以不用表明,可是幸免出现类似上边的错误音讯,显式声明依旧有利益的。

请求的资源不支持 http 方法“POST

诸如在基类定义的摸索对象接口如下所示。

        /// <summary>
        /// 查询数据库,检查是否存在指定ID的对象
        /// </summary>
        /// <param name="id">对象的ID值</param>
        /// <returns>存在则返回指定的对象,否则返回Null</returns>
        [HttpGet]
        public virtual T FindByID(string id, string token)

假假诺增删改的接口,一般必要注明为POST方式提交数据,而且据悉安全性的考虑,须求指导越多的参数。

        /// <summary>
        /// 插入指定对象到数据库中
        /// </summary>
        /// <param name="info">指定的对象</param>
        /// <returns>执行操作是否成功。</returns>
        [HttpPost]
        public virtual CommonResult Insert(T info, string token, string signature, string timestamp, string nonce, string appid)

 

壹 、在接口定义中分明MVC的GET可能POST格局

出于我们整个Web API平台是基于MVC的底子上进展的API开发,由此全数Web
API的接口,在概念的时候,一般需求显示来声称接口是[HttpGet]或者[HttpPost],即使某些接口也可以不用表明,不过幸免出现类似下边的错误消息,显式声明依旧有实益的。

请求的资源不支持 http 方法“POST

比如说在基类定义的探寻对象接口如下所示。

/// <summary>
/// 查询数据库,检查是否存在指定ID的对象
/// </summary>
/// <param name="id">对象的ID值</param>
/// <returns>存在则返回指定的对象,否则返回Null</returns>
[HttpGet]
public virtual T FindByID(string id, string token)

如果是增删改的接口,一般须要表明为POST格局提交数据,而且据悉安全性的设想,须求辅导越来越多的参数。

/// <summary>
/// 插入指定对象到数据库中
/// </summary>
/// <param name="info">指定的对象</param>
/// <returns>执行操作是否成功。</returns>
[HttpPost]
public virtual CommonResult Insert(T info, string token, string signature, string timestamp, string nonce, string appid)

二 、动态目标的接口定义

在相似的Web
API接口里面,大家恐怕都会遭受很多简短类型的参数,但是又想让它们以POST格局提交数据,那么我们就能够有三种方法来拍卖,一种是概念3个类来放置那几个参数,一种是使用动态的JObject参数,前者有诸多不便于的地点,因为大家不容许为各类接口参数定义多一个实体类,那样或者会有成百上千麻烦管理的类定义。如上面是微信API的调用接口案例,大家也需要安装这么的处理规则。

接口调用请求说明
http请求方式: POST(请使用https协议)
https://api.weixin.qq.com/cgi-bin/groups/update?access_token=ACCESS_TOKEN
POST数据格式:json
POST数据例子:{"group":{"id":108,"name":"test2_modify2"}}

那么大家使用JObject是那般的啊,大家来看接口的定义和拍卖代码。JObject是牛顿soft.Json.Linq命名空间下的三个目标。

        /// <summary>
        /// 修改用户密码
        /// </summary>
        /// <param name="param">包含userName和userPassword的复合对象</param>
        /// <param name="token">用户访问令牌</param>
        /// <returns></returns>
        [HttpPost]
        public CommonResult ModifyPassword(JObject param,  string token)
        {
            //令牌检查,不通过则抛出异常
            CheckResult checkResult = CheckToken(token);
            dynamic obj = param;
            if (obj != null)
            {
                string userName = obj.userName;
                string userPassword = obj.userPassword;

                bool success = BLLFactory<User>.Instance.ModifyPassword(userName, userPassword);
                return new CommonResult(success);
            }
            else
            {
                throw new MyApiException("传递参数出现错误");
            }
        }

内部大家把JObject对象转换为大家所必要的靶子的时候,因为咱们没有概念具体的实体类,由此利用了dynamic语法,注明那是3个动态目的,由运维时得到相应的性质。

dynamic obj = param;

如此那般大家就足以在调用的时候,动态POST对应的JSON对象给Web
API接口,而不需求事先定义种种接口参数的类了。

        /// <summary>
        /// 调用Web API接口,修改用户密码
        /// </summary>
        /// <param name="userName">用户名称</param>
        /// <param name="userPassword">修改的密码</param>
        /// <returns>如果修改成功返回true,否则返回false</returns>
        public bool ModifyPassword(string userName, string userPassword)
        {
            var action = "ModifyPassword";
            var postData = new
            {
                userName = userName,
                userPassword = userPassword
            }.ToJson();

            string url = GetTokenUrl(action);

            CommonResult result = JsonHelper<CommonResult>.ConvertJson(url, postData);
            return (result != null) ? result.Success : false;
        }

内部GetTokenUrl是依据token和API的地址等参数,创设3个完全的交付地址。我们在地点代码通过

            var postData = new
            {
                userName = userName,
                userPassword = userPassword
            }.ToJson();

就足以动态创造3个对象,并转移它的JSON字符串,把数据POST提交到对应的API接口里面即可,然后对结果进行对象的变换尽管完事了。

 

二 、动态目的的接口定义

在形似的Web
API接口里面,大家兴许都会赶上很多简单类型的参数,可是又想让它们以POST方式提交数据,那么我们就可以有两种方式来处理,一种是概念一个类来放置那个参数,一种是运用动态的JObject参数,前者有无数不便于的地方,因为大家不容许为各种接口参数定义多一个实体类,这样只怕会有恒河沙数麻烦管理的类定义。如上面是微信API的调用接口案例,大家也要求安装那样的处理规则。

接口调用请求说明http请求方式: POST(请使用https协议)https://api.weixin.qq.com/cgi-bin/groups/update?access_token=ACCESS_TOKENPOST数据格式:json**POST数据例子:{"group":{"id":108,"name":"test2_modify2"}}**

那么大家应用JObject是那般的啊,大家来看接口的定义和处理代码。JObject是牛顿soft.Json.Linq命名空间下的三个对象。

/// <summary>
/// 修改用户密码
/// </summary>
/// <param name="param">包含userName和userPassword的复合对象</param>
/// <param name="token">用户访问令牌</param>
/// <returns></returns>
[HttpPost]
public CommonResult ModifyPassword(JObject param,  string token)
{
    //令牌检查,不通过则抛出异常
    CheckResult checkResult = CheckToken(token);
    dynamic obj = param;
    if (obj != null)
    {
        string userName = obj.userName;
        string userPassword = obj.userPassword;

        bool success = BLLFactory<User>.Instance.ModifyPassword(userName, userPassword);
        return new CommonResult(success);
    }
    else
    {
        throw new MyApiException("传递参数出现错误");
    }
}

里头我们把JObject对象转换为大家所急需的对象的时候,因为大家一直不定义具体的实体类,因而拔取了dynamic语法,申明那是三个动态目的,由运维时拿到相应的习性。

dynamic obj = param;

诸如此类我们就足以在调用的时候,动态POST对应的JSON对象给Web
API接口,而不须要事先定义种种接口参数的类了。

/// <summary>
/// 调用Web API接口,修改用户密码
/// </summary>
/// <param name="userName">用户名称</param>
/// <param name="userPassword">修改的密码</param>
/// <returns>如果修改成功返回true,否则返回false</returns>
public bool ModifyPassword(string userName, string userPassword)
{
    var action = "ModifyPassword";
    var postData = new
    {
        userName = userName,
        userPassword = userPassword
    }.ToJson();

    string url = GetTokenUrl(action);

    CommonResult result = JsonHelper<CommonResult>.ConvertJson(url, postData);
    return (result != null) ? result.Success : false;
}

里头GetTokenUrl是根据token和API的地点等参数,营造壹个完全的交给地址。大家在下面代码通过

var postData = new
{
    userName = userName,
    userPassword = userPassword
}.ToJson();

就可以动态创制八个对象,并生成它的JSON字符串,把数据POST提交到相应的API接口里面即可,然后对结果开展对象的变换固然完事了。

叁 、集合和分页的拍卖

在广大接口里面,大家都必要用到分页的处理,Web
API也不例外,那样能够付出数据检索效用,收缩服务器数据处理的压力,同时也提交客户端的数码显示速度。

诚如的集纳接口定义如下所示(通用性基类接口)。

        /// <summary>
        /// 返回数据库所有的对象集合
        /// </summary>
        /// <returns>指定对象的集合</returns>
        [HttpGet]
        public virtual List<T> GetAll(string token)
        {
            //检查用户是否有权限,否则抛出MyDenyAccessException异常
            base.CheckAuthorized(AuthorizeKey.ListKey, token);

            List<T> list = baseBLL.GetAll();
            return list;
        }

882828九五至尊手机版,只是那样的回来记录会比较多,一般情状下需求分页,那么分页的拍卖接口定义如下所示。

        /// <summary>
        /// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
        /// </summary>
        /// <returns>指定对象的集合</returns>
        [HttpPost]
        public virtual PagedList<T> FindWithPager(string condition, PagerInfo pagerInfo, string token)

分页接口,在此地再次来到的结果里面,用了贰个PageList的泛型类,这么些有利大家得到当前的记录及总数,它的概念如下所示。

    /// <summary>
    /// 分页集合
    /// </summary>
    /// <typeparam name="T">对象</typeparam>
    public class PagedList<T>
    {
        /// <summary>
        /// 返回记录的总数
        /// </summary>
        public int total_count { get; set; }

        /// <summary>
        /// 列表集合
        /// </summary>
        public List<T> list { get; set; }
    }

说到底整个分页的拍卖Web API接口已毕如下所示。

        /// <summary>
        /// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
        /// </summary>
        /// <returns>指定对象的集合</returns>
        [HttpPost]
        public virtual PagedList<T> FindWithPager(string condition, PagerInfo pagerInfo, string token)
        {
            //检查用户是否有权限,否则抛出MyDenyAccessException异常
            base.CheckAuthorized(AuthorizeKey.ListKey, token);

            List<T> list = baseBLL.FindWithPager(condition, pagerInfo);

            //构造成Json的格式传递
            var result = new PagedList<T>() { total_count = pagerInfo.RecordCount, list = list };
            return result;
        }

最终客户端调用分页的Web API代码如下所示。

        /// <summary>
        /// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
        /// </summary>
        /// <param name="condition">查询的条件</param>
        /// <param name="pagerInfo">分页实体</param>
        /// <returns>指定对象的集合</returns>
        public virtual List<T> FindWithPager(string condition, ref PagerInfo pagerInfo)
        {
            var action = "FindWithPager";
            string url = GetTokenUrl(action) + string.Format("&condition={0}", condition);
            var postData = pagerInfo.ToJson();

            List<T> result = new List<T>();
            PagedList<T> list = JsonHelper<PagedList<T>>.ConvertJson(url, postData);
            if (list != null)
            {
                pagerInfo.RecordCount = list.total_count;//修改总记录数
                result = list.list;
            }
            return result;
        }

 

叁 、集合和分页的处理

在不计其数接口里面,大家都亟待用到分页的处理,Web
API也不例外,那样可以提交数据检索功用,裁减服务器数据处理的下压力,同时也付出客户端的多少浮现速度。

貌似的聚众接口定义如下所示(通用性基类接口)。

/// <summary>
/// 返回数据库所有的对象集合
/// </summary>
/// <returns>指定对象的集合</returns>
[HttpGet]
public virtual List<T> GetAll(string token)
{
    //检查用户是否有权限,否则抛出MyDenyAccessException异常
    base.CheckAuthorized(AuthorizeKey.ListKey, token);

    List<T> list = baseBLL.GetAll();
    return list;
}

但是这么的回来记录会相比多,一般景观下须求分页,那么分页的处理接口定义如下所示。

/// <summary>
/// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
/// </summary>
/// <returns>指定对象的集合</returns>
[HttpPost]
public virtual PagedList<T> FindWithPager(string condition, PagerInfo pagerInfo, string token)

分页接口,在此地重临的结果里面,用了3个PageList的泛型类,这么些有利大家拿到当前的笔录及总数,它的概念如下所示。

/// <summary>
/// 分页集合
/// </summary>
/// <typeparam name="T">对象</typeparam>
public class PagedList<T>
{
    /// <summary>
    /// 返回记录的总数
    /// </summary>
    public int total_count { get; set; }

    /// <summary>
    /// 列表集合
    /// </summary>
    public List<T> list { get; set; }
}

最终整个分页的处理Web API接口完毕如下所示。

/// <summary>
/// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
/// </summary>
/// <returns>指定对象的集合</returns>
[HttpPost]
public virtual PagedList<T> FindWithPager(string condition, PagerInfo pagerInfo, string token)
{
    //检查用户是否有权限,否则抛出MyDenyAccessException异常
    base.CheckAuthorized(AuthorizeKey.ListKey, token);

    List<T> list = baseBLL.FindWithPager(condition, pagerInfo);

    //构造成Json的格式传递
    var result = new PagedList<T>() { total_count = pagerInfo.RecordCount, list = list };
    return result;
}

终极客户端调用分页的Web API代码如下所示。

/// <summary>
/// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
/// </summary>
/// <param name="condition">查询的条件</param>
/// <param name="pagerInfo">分页实体</param>
/// <returns>指定对象的集合</returns>
public virtual List<T> FindWithPager(string condition, ref PagerInfo pagerInfo)
{
    var action = "FindWithPager";
    string url = GetTokenUrl(action) + string.Format("&condition={0}", condition);
    var postData = pagerInfo.ToJson();

    List<T> result = new List<T>();
    PagedList<T> list = JsonHelper<PagedList<T>>.ConvertJson(url, postData);
    if (list != null)
    {
        pagerInfo.RecordCount = list.total_count;//修改总记录数
        result = list.list;
    }
    return result;
}

四 、混合框架界面整合Web API接口

在全路Web
API的平台营造以及在混合框架的组成进程中,我把各样模块如故依照相对独立的点子展开开发和烧结,它们贯彻了从直接访问数据库、以WCF服务获取数据,以及经过WebAPI调用格局获取数据两种办法的联结,从而完成了全副混合框架的莫大结合。

882828九五至尊手机版 1

一体混合框架的基本是以相对独立的点子,整合各类可选择的模块,大家可以遵守一定的基础上,快捷创设统一的施用平台。

882828九五至尊手机版 2

搭建已毕的全体WebAPI平台,其中囊括了服务端内容,以API控制器的方法,发表了相应的Web
API接口。

882828九五至尊手机版 3

在每种混合框架的单独模块里面,大家封装了对应的Web
API客户端调用处理,从而完毕了Web API的调用方式。

882828九五至尊手机版 4

在Win10下,使用Web API方式运维混合框架,得到的本位界面效果如下所示。

882828九五至尊手机版 5

单身模块权限管理种类界面如下所示。

882828九五至尊手机版 6

 

不可枚举小说如下所示:

Web
API应用架构在Winform混合框架中的应用(1)

Web
API应用架构在Winform混合框架中的应用(2)–自定义非常结果的处理

Web
API接口设计经验计算
 

Web
API应用架构在Winform混合框架中的应用(3)–Winfrom界面调用WebAPI的进度分解

 Web
API应用架构在Winform混合框架中的应用(4)–利用代码生成工具急迅支付总体应用

 Web
API应用架构在Winform混合框架中的应用(5)–系统级别字典和商店级别字典并存的处理方式

 

④ 、混合框架界面整合Web API接口

在任何Web
API的平台营造以及在混合框架的三结合进度中,小编把各种模块照旧根据相对独立的法门开展付出和重组,它们贯彻了从第1手访问数据库、以WCF服务获取数据,以及通过WebAPI调用格局获取数据两种办法的统一,从而完毕了方方面面混合框架的可观结合。

全部混合框架的主干是以相对独立的法门,整合各样可接纳的模块,大家可以根据一定的基本功上,快捷营造统一的使用平台。

搭建落成的一体WebAPI平台,其中囊括了服务端内容,以API控制器的点子,公布了相应的Web
API接口。

在种种混合框架的独门模块里面,大家封装了对应的Web
API客户端调用处理,从而完成了Web API的调用格局。

在Win10下,使用Web API格局运作混合框架,得到的基本点界面效果如下所示。

独自模块权限管理连串界面如下所示。

Your Comments

近期评论

    功能


    网站地图xml地图