一、开启网络权限#
二、网络请求的封装
1.首先设置一个基地址(请求url通常由协议、域名、资源路径组成),由于大多数接口基地址一样只需要拼接就可以组成完整的接口地址
const baseUrl = 'https://api-harmony-teach.net/'
2.Post请求的封装
// 1.统一封装post请求方法
static async post<T>(url: string, extraData?: Object) {
try {
// 2. 创建http请求对象
const httpReq = http.createHttp()
// 3. 配置请求参数
let options: http.HttpRequestOptions = {
method: http.RequestMethod.POST,
header: {
"Content-Type": "application/json"
},
expectDataType: http.HttpDataType.OBJECT
}
// 1. 判断extraData可选参数如果不为空,则要将其追加到options对象中
if (extraData) {
options.extraData = extraData
}
// 2. 从AppStorage('user')中获取数据token,如果有值则追加到options.header中的Authorization
let user = AppStorage.get('user') as iLoginDataModel
// 使用user?写法,就能规避bug:在undefined上点出token这个属性报错
let token = user?.token
if (token && options.header) {
options.header['Authorization'] = `Bearer ${token}`
}
// 3. 将动态构建好的options参数和url传给request->发请求获取服务器的响应数据
url = baseUrl + url // 将用户传入的路径与基本地址拼接成一个完整的url地址,将来java后端发布接口的baseurl改变,我们只需要改变baseurl
let res = await httpReq.request(url, options)
// 增加服务器响应的code如果为401表示token失效,则重新登录获取新的有效token
let resdata = res.result as iResponseModel<T>
if (resdata.code !== 10000) {
if (resdata.code === 401) {
// promptAction.showToast({ message: resdata.code.toString() })
// token失效,重新登录
promptAction.showToast({ message: 'token失效,请重新登录' })
router.replaceUrl({ url: 'pages/LoginPage' })
} else {
promptAction.showToast({ message: resdata.message })
}
}
// 4. 将服务器的数据返回
return resdata
} catch (err) {
promptAction.showToast({ message: '网络请求错误' })
return Promise.reject(err)
}
}
3.Get请求的封装
// 2. 统一封装get请求方法
static async get<T>(url: string) {
try {
// 1. 创建http请求对象
const httpReq = http.createHttp()
let user = AppStorage.get('user') as iLoginDataModel
// 2. 配置请求参数
let options: http.HttpRequestOptions = {
method: http.RequestMethod.GET,
header:{
"Authorization": `Bearer ${user.token}`
},
expectDataType: http.HttpDataType.OBJECT
}
let token = user?.token
if (token && options.header) {
options.header['Authorization'] = `Bearer ${token}`
}
url = baseUrl + url
let res = await httpReq.request(url, options)
let resdata = res.result as iResponseModel<T>
if (resdata.code !== 10000) {
if (resdata.code === 401) {
// token失效,重新登录
promptAction.showToast({ message: 'token失效,请重新登录' })
router.replaceUrl({ url: 'pages/LoginPage' })
} else {
promptAction.showToast({ message: resdata.message })
}
}
return resdata
}
catch (err) {
promptAction.showToast({ message: '网络请求错误' })
return Promise.reject(err)
}
}