微信小程序发起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 => {
// 处理业务逻辑
})
{{ cmt.username }}
{{ cmt.content }}
{{ cmt.commentDate | formatDate('YYYY.MM.DD hh:mm') }}