zoukankan      html  css  js  c++  java
  • 微信小程序的Web API接口设计及常见接口实现

    微信小程序给我们提供了一个很好的开发平台,可以用于展现各种数据和实现丰富的功能,通过小程序的请求Web API 平台获取JSON数据后,可以在小程序界面上进行数据的动态展示。在数据的关键 一环中,我们设计和编写Web API平台是非常重要的,通过这个我们可以实现数据的集中控制和管理,本篇随笔介绍基于Asp.NET MVC的Web API接口层的设计和常见接口代码的展示,以便展示我们常规Web API接口层的接口代码设计、参数的处理等内容。

    1、Web API整体性的架构设计

    我们整体性的架构设计,包含一个Web管理后台、一个Web API统一接口层、当然还有数据库什么,另外还有一个小程序客户端。整个架构体系还是以我之前随笔介绍的《 整合微信小程序的Web API接口层的架构设计》内容为蓝本

    整个体系以Web API为主提供服务,同时后台管理系统通过各种界面维护着数据的增删改等基础管理工作。

    Web API的分层,我们可以通过下图来了解具体的分层结构。

    随着基于JSON格式的Web API的广泛应用,越来越多的企业采用Web API接口服务层,作为统一接口的核心所在,也成为Web API核心层。基于JSON格式的接口,可以广泛地、跨平台的应用于IOS、安卓等移动端,也可以应用在常规的Web业务系统,Winform业务系统、微信应用、微信小程序等方方面面,因此企业内部形成自己是的一套Web API标准和详细的文档非常重要。

    我们可以细化为下面的架构设计图,所有模块均围绕着Web API 接口层进行扩展,底层的数据存储对上层的应用是完全透明,我们可以根据需要拆分各种业务数据库,以及使用我们认为合适的数据库。

    其中我们在Web API接口层上还看到一个微信消息交互的模块,这个模块我们为了方便域名端口的处理,和Web API 是统一放在一起的,它负责和腾讯微信服务器进行消息的交互处理,从而实现各种消息推送处理。

    2、基于Asp.NET MVC的Web API接口的实现

     1)GET方式

    GET方式,接口参数包括有零或一个参数,以及多个参数的方式,返回的值可以是简单的字符串等基础类型,也可以是复杂的自定义对象类型等,如下面几种接口代码所示。

    复制代码
            /// <summary>
            /// 简单的GET方式获取数据
            /// </summary>
            /// <param name="id">字符串ID</param>
            /// <param name="token">接口访问令牌</param>
            /// <returns>返回字符串值</returns>
            [HttpGet]
            public string Test(string id, string token)
            {
                return string.Format("返回结果, id:{0}", id);
            }
    
            /// <summary>
            /// 多个参数的GET方式获取数据
            /// </summary>
            /// <param name="id">字符串ID</param>
            /// <param name="name">名称</param>
            /// <param name="token">接口访问令牌</param>
            /// <returns>返回字符串值</returns>
            [HttpGet]
            public string TestMulti(string id, string name, string token)
            {
                return string.Format("返回结果, id:{0} name:{1}", id, name);
            }
    
            /// <summary>
            /// 参数测试GET返回自定义实体类对象
            /// </summary>
            /// <param name="id">字符串ID</param>
            /// <param name="token">接口访问令牌</param>
            /// <returns>返回自定义实体类对象</returns>
            [HttpGet]
            public virtual CommonResult TestObject(string id, string token)
            {
                return new CommonResult() { Data1 = id, Success = true };
            }
    
            /// <summary>
            /// 测试GET返回列表对象
            /// </summary>
            /// <param name="token">接口访问令牌</param>
            /// <returns>返回列表对象</returns>
            [HttpGet]
            public List<string> TestAction(string token)
            {
                List<string> list = new List<string>() { "123", "234", "345" };
                return list;
            }
    复制代码

    2)POST方式

    POST方式,同样也和GET方式的一样,接口参数包括有零或一个参数,以及多个参数的方式,返回的值可以是简单的字符串等基础类型,也可以是复杂的自定义对象类型等,这就是几种常规的接口处理。但是,对于多个参数的接口定义,我们需要对它们进行转换处理,需要使用JObject param的方式进行定义,这样可以很好对多个参数或者自定义的实体类参数进行解析。

    下面是几种常规的POST接口定义方式。

    复制代码
            /// <summary>
            /// 测试使用POST方式提交数据,参数输入为多个,使用JObject处理
            /// </summary>
            /// <returns>返回字符串</returns>
            [HttpPost]
            public string TestPost(JObject param, string token)
            {
                dynamic obj = param;
                string id = obj.id;
                if (obj != null)
                {
                    return string.Format("返回结果, id:{0}", id);
                }
                else
                {
                    throw new MyApiException("传递参数出现错误");
                }
            }
    
            /// <summary>
            /// 测试使用POST方式提交数据,参数输入为多个,使用JObject处理
            /// </summary>
            /// <returns>返回参数计算数值</returns>
            [HttpPost]
            public int TestPostSimple(JObject param)
            {
                dynamic obj = param;
                if (obj != null)
                {
                    return obj.x * obj.y * 10;
                }
                else
                {
                    throw new MyApiException("传递参数出现错误");
                }
            }    
            
            /// <summary>
            /// 测试POST的方法,方法统一采用JObject param 方式定义,包含一个msg字符串对象,以及一个CListItem对象
            /// </summary>
            /// <returns>返回一个通用的CommonResult对象,包括Data1,Data2,Data3的信息</returns>
            [HttpPost]
            public CommonResult TestPostObject(JObject param)
            {
                dynamic obj = param;
                if (obj != null)
                {
                    string msg = obj.msg; //消息对象
                    //如果obj.item为类对象,那么需要转换为JObject然后使用ToObject转换为对应类型
                    CListItem item = ((JObject)obj.item).ToObject<CListItem>();
    
                    var result = new CommonResult(true, msg);
                    result.Data1 = msg;
                    result.Data2 = item.Text;
                    result.Data3 = item.Value;
                    return result;
                }
                else
                {
                    throw new MyApiException("传递参数出现错误");
                }
            }
            /// <summary>
            /// 修改分组,方法统一采用JObject param 方式定义,包括一个字符串对象contactId,一个字符串列表对象groupIdList
            /// </summary>
            /// <returns>返回一个通用的对象</returns>
            [HttpPost]
            public CommonResult TestPostList(JObject param)
            {
                dynamic obj = param;
                if (obj != null)
                {
                    string contactId = obj.contactId; //联系人ID
                    //如果是List<string>的类似列表,不能直接转换,先转换为JArray后使用ToObject转换为对应列表
                    List<string> groupIdList = ((JArray)obj.groupIdList).ToObject<List<string>>();
    
                    var result = true; //BLLFactory<Address>.Instance.ModifyAddressGroup(contactId, groupIdList);
                    return new CommonResult(result);
                }
                else
                {
                    throw new MyApiException("传递参数出现错误,请检查是否包含了contactId和groupIdList");
                }
            }
    复制代码

    接口类,我们一般把类继承自自己的API接口基类,并对它的异常处理进行处理,以便对错误统一格式回应,如下接口类的代码定义所示。

    复制代码
        /// <summary>
        /// 此控制器用来详细介绍各种GET/POST的接口设计
        /// 对于GET方式,方法可以接受多个参数
        /// 对于POST方式,方法如果有参数使用POST方式,统一采用JObject param对象参数。
        /// 如果POST方式有多个参数,如Web API接口加token,则需要客户端把该参数追加在URL上,如url?token=123,然后在使用POST操作
        /// </summary>
        [ExceptionHandling]
        public class TestController : BaseApiController
    复制代码

    其中ExceptionHandling是我们的统一异常过滤处理定义,代码如下所示。

    复制代码
        /// <summary>
        /// API自定义错误过滤器属性
        /// </summary>
        public class ExceptionHandlingAttribute : ExceptionFilterAttribute
        {
            /// <summary>
            /// 统一对调用异常信息进行处理,返回自定义的异常信息
            /// </summary>
            /// <param name="context">HTTP上下文对象</param>
            public override void OnException(HttpActionExecutedContext context)
            {
                //自定义异常的处理
                MyApiException ex = context.Exception as MyApiException;
                if (ex != null)
                {
                    //记录关键的异常信息
                    LogHelper.Error(context.Exception);
    
                    throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
                    {
                        //封装处理异常信息,返回指定JSON对象
                        Content = new StringContent(new BaseResultJson(ex.Message, false, ex.errcode).ToJson()),
                        ReasonPhrase = "Exception"
                    });
                }            
                
                //常规异常的处理
                string msg = string.IsNullOrEmpty(context.Exception.Message) ? "接口出现了错误,请重试或者联系管理员" : context.Exception.Message;
                throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
                {
                    Content = new StringContent(msg),
                    ReasonPhrase = "Critical Exception"
                });
            }
        }
    复制代码

    3)小程序端代码处理

    小程序端主要是通过JS代码进行处理,实现数据的获取及提交处理等。

    如我们列举一个代表性的POST处理代码,如下所示。

    复制代码
      //测试POst方法
      wx.request({
        url: 'http://localhost:27206/api/SmallApp/Test/TestPostObject',
        data: { 
          msg : '测试内容', 
          item: {Text :'Text', Value:'testValue'}
        },
        header: {'Content-Type': 'application/json' },
        method: 'POST',
        success: function (res) {
          console.log(res.data);
        }
      });
    复制代码

    而对于GET方式,我们的小程序调用方式如下所示。

    复制代码
      getFilms: function(start) {
        console.log('start:' + start);
        var that = this
    
        wx.request({
          url: 'http://www.iqidi.com/api/h5/test/movies',
          data: {
            offset: start,
            type: 'hot',
            limit: that.data.limit
          },
          header: {
              'Content-Type': 'application/json'
          },
          success: function (res) {
            console.log(res.data)
    
            var data = res.data.data;
            console.log(data);
            if (data.movies.length === 0) {
              that.setData({
                hasMore: false,
                hideLoading :true,
              })
            } 
            else {
              that.setData({
                films: that.data.films.concat(data.movies),
                start: that.data.start + data.movies.length,
                hasMore: true,
                hideLoading :true,
              });
            }
          }
        })
    复制代码

    以上就是我们常规接口(单个参数或者多个参数,简单对象和复杂对象的处理)的定义代码,希望读者在开发Web API接口的时候,可以有所帮助。

    查看全文
  • 相关阅读:
    skywalking监控配置tomcat的参数
    weblogic启动受管理节点
    JavaScript中的数组遍历forEach()与map()方法以及兼容写法
    ajax与HTML5 history pushState/replaceState实例
    mongoose参考手册
    mongoose
    解决ul里最后一个li的margin问题
    前端开发中最常用的JS代码片段
    CSS3精美前端
    60个有用的css代码片段
  • 原文地址:https://www.cnblogs.com/itrena/p/9176216.html
  • 最新文章
  • 关于pgsql输出表结构的问题
    navicat远程连接mysql,2003 can't connect to mysql server on 10038
    php基础部分总结篇-魔术方法
    第一次接触php项目的反思
    phpstorm配置xdebug进行远程调试(ubuntu)
    Linux基础学习--1:linux内核与发行详解
    php的MVC基本理解与原理
    tf.nn.embedding_lookup
    tf.strided_slice_and_tf.fill_and_tf.concat
    tf.contrib.layers.embed_sequence()
  • 热门文章
  • 30-奇异值分解
    29-相似矩阵和若尔当形
    28-正定矩阵和最小值
    25-复习二
    24-马尔可夫矩阵,傅立叶级数
    22-对角化和A的幂
    21-特征值和特征向量
    Prometheus时区问题
    数据中心灾难恢复的重要参考指标:RTO和RPO
    skywalking监控weblogic参数
Copyright © 2011-2022 走看看

PHP网站源码果洛网站制作哪家好临沧百度爱采购推荐常州网站制作沙井网站优化推广报价南昌网站优化按天扣费报价汉中关键词排名包年推广报价唐山网站推广工具公司黔西南网站定制哪家好塘坑设计网站江门网站建设巴中优秀网站设计报价绵阳网站优化推广南京seo网站推广新乡百度竞价多少钱许昌网络推广哪家好巴中模板网站建设公司通辽百度爱采购塔城优秀网站设计公司钦州SEO按天计费哪家好崇左百度关键词包年推广多少钱廊坊网站优化按天计费多少钱衡阳网站设计模板哪家好大庆建设网站公司湘潭网站搜索优化哪家好杭州网站排名优化哪家好龙华品牌网站设计价格网站关键词优化价格白城seo网站优化多少钱上海企业网站制作哪家好鄂州网站搭建价格歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化