微信小程序开发记录 -- request

zwz

发布于 2018.07.04 16:28 阅读 3027 评论 0

微信小程序发起ajax请求是使用的微信API wx.request

1. 微信使用request有以下几点注意

1.  Content-Type

request的Content-Type要根据不同的请求类型进行不同的设置, 否则后端接收不到数据

post: application/x-www-form-urlencoded;charset=utf-8

get:application/json

2. request每次请求默认的session都会和上一次不一样,导致后端无法根据session获取session中的信息

设置 requestHeader.Cookie = `JSESSIONID=${app.globalData.sessionId}`, appglobalData.sessionId是第一次登录时得到的sessionId,在以后每次请求中都要设置上

2. 为了进行统一处理, 需要对request进行封装

/**
 * 统一的请求方法
 * @param.url: 请求链接,会对url进行处理, 看 tools.completionUrl
 * @param.method: 请求方法
 * @param.data: 请求参数
 * @param.needData: 请求结果是否应该包含数据 result.root
 * @param.requestCode: 自定义字符串, 一个页面不要重复,主要作为标志位 [String]
 * 
 * 备注:
 * 此方法只调用 resolve, 不调用 reject
 */

function request({ url, method = 'POST', data = {}, needData = true, requestCode }) {
  return new Promise((resolve, reject) => {
    requestAbort[requestCode] = wx.request({
      url: tools.completionUrl(url), // 对url进行统一处理, 补充基础路径等
      data: data,
      method: method,
      header: tools.setRequestHeader(method), // 对header统一处理, 修改content-type, 传递sessionId等
      success(response) { 
        // 请求成功、400、405等错误均执行此方法, 但不处理,统一到complete中处理
      },
      fail(error) {
        // 一般为接口调用错误: 例如: 链接是http不是https , 但不处理,统一到complete中处理
      },
      complete(response) {
        let result
        if (response.errMsg === 'request:fail abort') {
          return
        }
        if (response.statusCode === undefined) {
          // 没有状态码, 一般为接口调用错误: 例如: 链接是http不是https 
          result = {...} 
        } else if (response.statusCode === 200) {
          // 对请求结果进行那个统一的格式化
          result = formatResponse(response.data, needData)
        } else {
          // 404 500...
          // 此除进行统一的处理
        }
        // 不管正确错误, 都执行resolve不执行reject, 方便管理
        resolve(result)
      }
    })
  })
}

调用

function getXXX(data) {
  return request({
    url: 'controller/path',
    method: 'POST',
    needData: true,
    data
  })
}

getXXX(data).then(result => {
  // 处理业务逻辑
})