封装网络请求

第一种uniapp的封装,第二种小程序的封装,第三种vue3(typescript)的封装

header = {
//当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串append到url后面,用?分割,加载这个新的url。
	'content-type': 'application/x-www-form-urlencoded;charset=utf-8',//charset=utf-8防止传的中文乱码
	
	'content-type': 'application/json;charset=utf-8',//application/json可以直接传数组
};

第一种
http.js文件里

import CONFIG from "./config.js"
import {getCacheSync,removeCacheSync} from '@/common/cache.js'//缓存

//请求封装
//type为0要token,1为不用token
var requestAll=function(e={}){
	return new Promise((resolve, reject)=>{
		let allUrl=CONFIG.baseUrl+e.url;
		var token = getCacheSync('token');
		if(token){
			if(e.header){
				e.header['Authorization'] = token;
			}else{
				e.header = {Authorization:token};
			}	
		}
		//讲get请求传的参数拼在链接后
		if(e.method && (e.method == 'GET' || e.method == 'get')){
			if(e.data && JSON.stringify(e.data) != '{}'){
				let para = '';
				for(let key in e.data){
					if(para){
						para += '&'+key+'='+e.data[key];
					}else{
						para += key+'='+e.data[key];
					}
				}
				allUrl += '?'+para;
			}
		}
		// console.log('请求域名',allUrl)
		// console.log('请求链接',e)
		
		uni.request({//发送请求
		    url: allUrl, 
		    data:e.data || {},
			method:e.method || 'post',
			timeout:10000,
		    header:e.header || {},
		    success: res=> {
				uni.hideLoading()
				// console.log('数据',res)
		    	if(res.statusCode == 200 && res.data.code == 200){
					resolve(res.data)
		    	}else if(res.statusCode == 200 && res.data.code == 401){
					//登录失效
					removeCacheSync('token')
					removeCacheSync('userInfo')
					uni.showToast({title:'登录已失效,请重新登录',duration:3000,icon:'none'})
					uni.reLaunch({
						url:'/pages/login/index/index'
					})
				}else if(res.statusCode == 404){
					uni.showToast({title:'请求地址错误',icon:'none'})
					reject(false)
				}else{
					uni.showToast({title:res.data.msg,icon:'none'})
					reject(res.data.msg)
				}
		    },
			fail: err => {//网络请求失败的回调
				console.log(err)
				uni.hideLoading()
				reject(err)
			}
		});
	})
}


export default requestAll

config.js文件里,判断是开发环境还是生产环境

const CONFIG = {
	// 开发环境配置
	development: {
		baseUrl:'xxxxxxxxxxx',//请求域名
	},
	// 生产环境配置
	production: {
		baseUrl:'xxxxxxxxxx',//请求域名
	}
}
export default CONFIG[process.env.NODE_ENV];

api.js文件里,所有接口放这

import requestAll from "./http"
module.exports={
	//1表示不用传token
	register(params) {
		return requestAll('/user/register', params,'POST',1)
	},
}

全局注册,页面调用

//main.js里
import API from "./common/api.js"
Vue.prototype.$api=API //全局引用api.js

//调用页面
//obj为传的参数
this.$api.register(obj)
.then(res =>{})
.catch(res =>{})







第二种
http.js文件里

//请求封装
const baseUrl = 'xxxxxxxxxxx';

//登录失效
function invalid(){
	wx.showToast({
		title: '登录已失效,请重新登录',
		duration: 2000,
		icon:'none'
	});
	
	//清空token
	wx.removeStorage({key: 'token'});

	setTimeout(val =>{
		wx.hideToast();
		wx.navigateTo({
			url:'/pages/login/login'
		})
	},2000)
}

//type为0要token,1为不用token
var requestAll=function(url,data={},method="GET",type=0,header={}){
	return new Promise((resolve, reject)=>{
		let allUrl=baseUrl+url;
		
		//type不为1,要传token
		if(type == 0){
			var token = wx.getStorageSync('token');
			header.token = token;
			//判断是否有token值,没有就让其重新登录
			if(!token){
				invalid();
				reject({msg:'token无效,请重新登录'});
				return
			}
		}
		
		wx.request({//发送请求
		    url: allUrl, 
		    data,
			method,
		    header,
		    success: res=> {
		    	//自定义返回的code值为多少代表token值无效
		    	if(res.data.code == 401){
					reject({msg:'登录已失效,请重新登录'})
					invalid();
				}else{
					resolve(res.data)
				}
		    },
			fail: err => {//网络请求失败的回调
					reject(err)
			}
		});
	})
}

module.exports = {
	requestAll
}

api.js文件里

const http = require('./http');

module.exports = {
	//1表示不用传token
	register (params) {
		return http.requestAll('/index/getImage', params,'GET',1)
	},
}

页面调用

const api = require('../../../utils/api');

Page({
    data: {

    },
    onLoad: function (options) {
        
        api.register()
        .then(res =>{
            console.log(res)
        })
        .catch(res =>{
            console.log(res)
        })
        console.log('请求数据')
    },
})

或者将封装的请求方法放到全局

// app.js
const newRequest = require('utils/api');
App({
  onLaunch() {
  },
  api:newRequest,//全局的网络请求
  globalData: {
  }
})

//调用的页面
const app = getApp();
Page({
    data: {
    },
    onLoad: function (options) {
        app.api.register()
        .then(res =>{
            console.log(res)
        })
        .catch(res =>{
            console.log(res)
        })
    },
})






第三种
request.ts文件里

import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
import baseUrl from './config'
import QS from 'qs' // 参数序列化
import { ElMessage } from 'element-plus'

// 创建axios实例
const instace:AxiosInstance = axios.create({
  baseURL: baseUrl,
  timeout: 10000,
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded;application/json'
  }
})

// 请求拦截
instace.interceptors.request.use((config:AxiosRequestConfig) => {
  const token:string | null = sessionStorage.getItem('token');
  if (token) {
    config.headers!.token = token;
  }
  return config;
}, (error) => {
  return Promise.reject(error);
})

// 响应拦截
instace.interceptors.response.use((response:AxiosResponse) => {
  // 2xx范围的状态码都会触发这里
  return response;
}, (error) => {
  if (error && error.response) {
    switch (error.response.status) {
      case 400:
        ElMessage.error('错误请求')
        break
      case 401:
        ElMessage.error('未授权,请重新登录')
        break
      case 403:
        ElMessage.error('拒绝访问')
        break
      case 404:
        ElMessage.error('请求错误,未找到该资源')
        break
      case 408:
        ElMessage.error('请求超时')
        break
      case 500:
        ElMessage.error('服务器端出错')
        break
      case 502:
        ElMessage.error('网络错误')
        break
      case 504:
        ElMessage.error('网络超时')
        break
      case 505:
        ElMessage.error('HTTP版本不受支持')
        break
      default:
        ElMessage.error(`连接错误${error.response.status}`)
    }
  } else {
    ElMessage.error('连接服务器失败')
  }
  return Promise.reject(error);
})

/**
 * GET请求
 */
const get = (url:string, params:object = {}) => {
  return new Promise((resolve, reject) => {
    instace.get(url, { params })
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err)
      })
  })
}

/**
 * POST请求
 */
const post = (url:string, data:object = {}) => {
  return new Promise((resolve, reject) => {
    instace.post(url, QS.stringify(data))
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err)
      })
  })
}

export default {
  get,
  post
}

config.ts文件里

let baseURL: string = '';

if (process.env.NODE_ENV === 'development') {
  // 开发环境,测试接口
  baseURL = 'xxxx';
} else {
  // 生产环境,正式接口
  baseURL = '';
}

export default baseURL


api.ts文件里

import http from './request'

export const houseCate = (params:object = {}) => {
  return http.get('/api/Houseabout/houseCate', params)
}

调用的页面里

import {houseCate} from '@/xxx/api'
houseCate().then(res =>{}).catch(res =>{})
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值