由于uniapp的请求方式和小程序类似的,很多人会觉得我为啥不直接用uni.request方法去请求呢!!
这个方法确实很简单,每个页面都可以单独写请求方式,但是如果有重复的接口请求呢?如果后期要改某一个地方的接口请求呢?这样就会给我们带来不小的工作量,可能改完一个地方,另外一个地方就忘了。
为了解决这种问题,我们可以把所有接口都封装起来,页面上做的事情就是纯粹的请求、传参、拿到结果。
先在项目目录上右键 - 新建目录(用于存放封装的API请求文件)
request
目录新建完成之后,还需要至少两个js文件
为啥这里说的是至少两个js文件呢?那是因为可能因为权限的原因,亦或者模块的分类等,可以把api.js文件给拆分出去,按照不同的权限、模块来进行分类,最终可以通过一个总的js文件合并,这样更利于后期维护。
export default class Request {
http(param) {
let url = param.url;
let method = param.method;
let header = param.header || {};
let data = Object.assign(param.data || {});
let hideLoading = param.hideLoading || false;
// 第一步的代码均在此处展示,后面示例代码就不写外层 class 和 http方法了。
....
}
}
hideLoading
主要是后面用于显示加载toast状态的let requestUrl = 'https://www.juejin.cn/' + url;
GET
、POST
两种方式,其他的请求方式可以根据需求去进行封装if (method) {
if (method == "POST") {
header = Object.assign({
'content-type': "application/x-www-form-urlencoded"
}, param.header)
} else {
header = Object.assign({
'content-type': "application/json"
}, param.header)
}
}
method
参数必须是大写的哦~(微信小程序和uniapp均有文档查阅)content-type
和用户传递的header
数据进行合并,组成一个新的header
参数if (!hideLoading) {
uni.showLoading()
}
.then
来拿到数据(也算是目前前端常用的写法了吧)return new Promise((resolve, reject) => {
uni.request({
url: requestUrl,
data: data,
method: method,
header: header,
success: (res) => {
// 下面会直接写请求成功的代码
......
},
fail: (err) => {
// 下面会直接写请求失败的代码
......
},
})
})
// success里面的逻辑代码
// 如果有显示loading的话,可以在这里选择隐藏
if (!hideLoading) {
uni.hideLoading();
}
// 判断请求是否成功(通过后端接口返回的状态进行判断)
// code:0 即成功,不为 0 的话就是请求错误/失败
if(res.data.code === 0){
resolve(res.data)
return true
} else {
if(res.data.code === -1){
// 这里是由于token过期导致的错误码
// 可以直接跳转到login页面,也可以直接刷新token
uni.navigateTo({
url: '/pages/login/login'
})
}
// 其他错误时,直接通过toast提示
uni.showToast({
title:res.data.msg,
icon:'none'
})
return false;
}
// fail里面的逻辑代码
// 如果有显示loading,同样需要隐藏
if (!hideLoading) {
uni.hideLoading();
}
return false;
import Request from './index.js'
let request = new Request().http
function get(url, data, hideLoading, header) {
return request({
url: url,
method: 'GET',
data: data,
header: header
})
}
function post(url, data, hideLoading, header) {
return request({
url: url,
method: 'POST',
data: data,
header: header,
hideLoading: hideLoading,
})
}
let api = {
login: data => post('loginapi', data, true, true)
}
export default api;
import api from "./request/api.js"
Vue.prototype.$http = api;
onLoad(){
this.$http.login().then(res=>{
console.log(res)
})
}
在uniapp中封装请求方法,其实和vue里面的axios封装方式差不多,通过一次封装,改变之后的开发模式和维护成本是很重要的。