接口文档说明(小程序)

## 说明 在456微营销系统中,为方便接口测试、修改、调用以及复用性,所以把接口分为五个部分,分别为 域名、终端、模块、接口名、传参 #### 域名: 为方便开发测试以及不影响线上项目的运营,搭建了一个同线上环境相同的测试服务器,一般都是要求在测试服务器上开发通过再上传到正式服务器运营。而且小程序正式环境是要做域名校验的,所以要注意两个域名之间的切换,以避免因微信审核耽误上线时间。 测试域名: `http://105.trtr.cn` 正式域名: `https://xcx.trtr.cn` *** #### 终端: 根据不同的用户群体以及设备类型分为三种类型,分别是 移动端`Wap`、小程序端`Wxapp`以及管理后台`User`。 *** #### 模块: 为便于管理以及开发效率,根据功能类型划分各个模块,如 投票模块`Voteimg`、砍价模块`Bargain`、拼团模块`Tuan`、电商模块`Ceshop`等。 *** #### 接口名: 后端语言中"类"的名称,一般与 域名、终端、模块、接口名以及传参 组成一个完整的 请求地址,用于前后端交互,发起(接收)数据的作用。 *** #### 传参: 与服务器交互中所需参数,用于明确具体需求,为简化开发,将参数分为两种: 一种为固定参数,即在当前模块中所有请求接口都需要的参数,具有普遍性 另一种是普通参数,在各个接口都不相同,是唯一的,不具有普遍性 ## 举例: 假设有这么一个接口:`https://xcx.trtr.cn/index.php?g=Wxapp&m=Ceshop&a=login` #### 请求参数 | 参数名 | 数据类型 | 说明 | | :-- | :--: | - | | token | String | 公众号在微信平台的唯一公钥ID,也是区分不同用户(小程序)的唯一标识 | | code | String | 小程序登录的code值,通过 wx.login 方法获取 | 根据以上规则可以把此接口拆分为五个部分即: | 名称 | 值 | 说明 | | - | :--: | - | | 域名 | https://xcx.trtr.cn | 服务器访问地址 | | 终端 | g=Wxapp | g 是 group 的缩写,用于代表终端类型 | | 模块 | m=Ceshop | m 是 module 的缩写,用于代表模块名 | | 接口名 | a=login | a 是 ajax 的缩写,用于代表接口名 | | 传参 | token、code | 又可以根据token的特性,将其划分为固定参数 | >i index.php 是一个入口文件名称(路由),可以理解成大门,我们往服务器中拿数据或是推送数据,都需要经过这里,可以固定下来,轻易不会变动。 #### 初衷 好了,说了这么说,其实就是为了方便开发封装一个接口地址的函数,以下仅是一个示例,并非固定格式,各位有兴趣的可以按照自己的习惯封装自己的方法。 ## 代码示例 ```Javascript /** * 建议把url函数封装在 app.js 主体中,便于其通过 getApp() 调用 * @param str {String} 接口名称 * @param obj {Object} 参数 * @variable token/sid {String} 因token和sid参数的通用性,故封装在接口中以get形式传参 **/ function url(str, obj){ var url = 'https://xcx.trtr.cn', //为了方便在测试与正式环境之间切换 //url = 'http://105.trtr.cn', sid = this.globalData.sid, token = this.globalData.token, uri = str.split('/'); url += '/index.php?'; if (uri.length == 1) { url = url + 'g=Wxapp&m=Ceshop&a=' + str; } else if (length == 2) { url += 'g=Wxapp&m=' + uri[0] + '&a=' + uri[1]; } else { url += 'g=' + uri[0] + '&m=' + uri[1] + '&a=' + uri[2]; } for (var i in obj) { url += '&' + i + '=' + obj[i]; } if (sid) url += "&sid=" + sid; url += '&token=' + token; return url; } ``` #### 为避免做多余的错误处理,经统一返回格式,作出以下请求封装 ```Javascript /** * @param url {String/Array} 接口名 * @param param {Object} 传参 * @param fn {Function} 请求成功的回调 * @param method {String} 请求方式,目前仅支持get和post请求 * @param failFn {Function} 请求失败的回调 * @return res {Object} 请求返回对象 * @return res.data.status {Number} 状态码(0:成功,1:失败) * @return res.data.msg {String/Object} 返回值 **/ function request(url, param, fn, method, failFn){ let urls; if (typeof arguments[1] == 'function') { param = {}; fn = arguments[1]; if (typeof arguments[2] == 'function') { method = 'GET'; failFn = arguments[2]; } } if (typeof arguments[3] == 'function') { method = 'GET'; failFn = arguments[2]; } if (typeof url == 'string'){ urls = this.url(url, method == 'post' ? '' : param); }else{ urls = this.url(url[0], url[1]); } wx.request({ method: method || 'get', url: urls, data: method == 'post' ? param : '', success: function(res) { wx.hideLoading(); if (res.data.status != 0) { //这个乱入的errcode是请求官方接口返回的错误码,这就没办法,只能做个兼容处理 wx.showModal({ title: res.data.errcode ? '错误码:' + res.data.errcode : '温馨提示', content: res.data.errmsg || res.data.msg, showCancel: false }) return false; } fn && fn(res); }, fail: function(res) { wx.hideLoading(); if (failFn){ failFn(res); }else{ wx.showModal({ title: '温馨提示', content: '哎呀,网络开小差了!', showCancel: false }) } } }) } ``` #### 调用示例 看完上面封装的 `request` 函数,可能有些细心的爱思考的小伙伴会纠结一个问题,那就是 为什么参数`url`会有两种数据类型,不明明就是一个接口名吗?String类型好理解,Array类型是个什么鬼? 好的,其实这个只是为了针对某个特殊情况作出的一个处理,就是 当接口请求方式是post时,却要传一个get形式的参数,emmmm ... 有点诡异吧,话不多说,请看示例 ```Javascript //以下是在 app.js 中的某个函数里,_this 代表的是 app /** * @param code {String} 用户在当前小程序中的身份识别 * @param user {Object} 用户公开信息(头像、名称、地址等) * 由于一系列的历史原因,导致后台不好更改传参的获取方式,才导致的这种很**的情况,便针对于此情形作出以下兼容处理 **/ _this.request(['login', { code: res.code }], user, function (res) { _this.globalData.sid = res.data.sid; fn && fn(res); }, 'POST'); ``` 以下是借用 [获取门店列表](https://easydoc.top/doc/39935978/k5QepJMO/aCmEQUd7) 接口作的示例: ```Javascript //以下对象就当做是在某个页面的 page 中吧 let app = getApp(); { getAgentList: function(){ var _this = this, param = { page: 1, lat: 28.23529, lng: 112.93134, token: 'hghbsm1406013577', agent_id: 0 }; /** Start 你需要的代码块 ...... End **/ wx.loading('正在加载...'); app.request('agent_list', param, function(res){ var list = res.data.msg.list; //门店列表获取到了,就这样吧,接下来你爱干嘛干嘛 }); } } ```