微信小程序的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接口的时候,可以有所帮助。

本文转自博客园伍华聪的博客,原文链接:微信小程序的Web API接口设计及常见接口实现,如需转载请自行联系原博主。

目录
相关文章
|
1月前
|
JSON API 数据库
解释如何在 Python 中实现 Web 服务(RESTful API)。
解释如何在 Python 中实现 Web 服务(RESTful API)。
25 0
|
1月前
|
前端开发 小程序 API
【微信小程序】-- 使用 npm 包 - API Promise化(四十二)
【微信小程序】-- 使用 npm 包 - API Promise化(四十二)
|
11天前
|
小程序 前端开发 API
小程序全栈开发中的RESTful API设计
【4月更文挑战第12天】本文探讨了小程序全栈开发中的RESTful API设计,旨在帮助开发者理解和掌握相关技术。RESTful API基于REST架构风格,利用HTTP协议进行数据交互,遵循URI、客户端-服务器架构、无状态通信、标准HTTP方法和资源表述等原则。在小程序开发中,通过资源建模、设计API接口、定义资源表述及实现接口,实现前后端高效分离,提升开发效率和代码质量。小程序前端利用微信API与后端交互,确保数据流通。掌握这些实践将优化小程序全栈开发。
|
1月前
|
XML JSON API
通过Flask框架创建灵活的、可扩展的Web Restful API服务
通过Flask框架创建灵活的、可扩展的Web Restful API服务
|
1月前
|
数据采集 供应链 前端开发
电商企业如何构建一站式数字化供应链体系|API接口实现淘宝/京东/1688多平台商品采集+上传一站式供应链系统搭建
网络时代,企业面临转型。如今进入数字化时代,企业再次面临重大变革,全面实现数字化、智能化已是当务之急。公司将继续良性发展,请记住16个字:精简流程、降低成本、提高效率、智慧管理。主流电商平台API商品数据采集接口,不但可以在商品采集上为供应链提供大量商品,同时我们也可以通过申请官方商品上传商品发布API接口,实现商品的多平台发布。
|
1月前
|
缓存 监控 API
Python Web框架FastAPI——一个比Flask和Tornada更高性能的API框架
Python Web框架FastAPI——一个比Flask和Tornada更高性能的API框架
57 0
|
1月前
|
JSON API 数据格式
构建高效Python Web应用:Flask框架与RESTful API设计实践
【2月更文挑战第17天】在现代Web开发中,轻量级框架与RESTful API设计成为了提升应用性能和可维护性的关键。本文将深入探讨如何使用Python的Flask框架来构建高效的Web服务,并通过具体实例分析RESTful API的设计原则及其实现过程。我们将从基本的应用架构出发,逐步介绍如何利用Flask的灵活性进行模块化开发,并结合请求处理、数据验证以及安全性考虑,打造出一个既符合标准又易于扩展的Web应用。
644 4
|
2月前
|
前端开发 JavaScript API
前端秘法番外篇----学完Web API,前端才能算真正的入门
前端秘法番外篇----学完Web API,前端才能算真正的入门
|
11天前
|
小程序 前端开发 API
小程序全栈开发中的多端适配与响应式布局
【4月更文挑战第12天】本文探讨了小程序全栈开发中的多端适配与响应式布局。多端适配涉及平台和设备适应,确保统一用户体验;响应式布局利用媒体查询和弹性布局维持不同设备的布局一致性。实践中,开发者可借助跨平台框架实现多平台开发,运用响应式布局技术适应不同设备。同时,注意兼容性、性能优化和用户体验,以提升小程序质量和用户体验。通过这些方法,开发者能更好地掌握小程序全栈开发。
|
11天前
|
小程序 前端开发 API
微信小程序全栈开发中的异常处理与日志记录
【4月更文挑战第12天】本文探讨了微信小程序全栈开发中的异常处理和日志记录,强调其对确保应用稳定性和用户体验的重要性。异常处理涵盖前端(网络、页面跳转、用户输入、逻辑异常)和后端(数据库、API、业务逻辑)方面;日志记录则关注关键操作和异常情况的追踪。实践中,前端可利用try-catch处理异常,后端借助日志框架记录异常,同时采用集中式日志管理工具提升分析效率。开发者应注意安全性、性能和团队协作,以优化异常处理与日志记录流程。

热门文章

最新文章