uni-app vue3 인터페이스 요청을 캡슐화하는 방법

WBOY
풀어 주다: 2023-05-11 19:28:10
앞으로
2394명이 탐색했습니다.

uni-app 인터페이스, 전역 메서드 캡슐화

1. 루트 디렉터리에 api 파일을 만들고 api 폴더

uni-app vue3 인터페이스 요청을 캡슐화하는 방법

2에 api.js, baseUrl.js 및 http.js 파일을 만듭니다. 파일 코드

export default "https://XXXX.test03.qcw800.com/api/"
로그인 후 복사

3.http.js 파일 코드

export function https(opts, data) {
	let httpDefaultOpts = {
		url: opts.url,
		data: data,
		method: opts.method,
		header: opts.method == 'get' ? {
			'X-Requested-With': 'XMLHttpRequest',
			"Accept": "application/json",
			"Content-Type": "application/json; charset=UTF-8"
		} : {
			'X-Requested-With': 'XMLHttpRequest',
			'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
		},
		dataType: 'json',
	}
	let token = uni.getStorageSync('token');
	if (token != undefined && token != null && token != '') {
		httpDefaultOpts.header.Authorization = 'Bearer ' + token;
	}
	let promise = new Promise(function(resolve, reject) {
		uni.request(httpDefaultOpts).then(
			(res) => {
				// console.log(res, '成功')
				if(res.statusCode == 401){
					uni.clearStorageSync();
				}
				resolve(res)
			}
		).catch(
			(response) => {
				// console.log(response, '失败')
				reject(response)
			}
		)
	})
	return promise
}
로그인 후 복사

4.api.js 파일 코드

export const rootUrl="https://ssss.test03.qcw800.com";  //其他接口域名
export const baseUrl= rootUrl + "api/";
export const api = {
	// 获取验证码
	guest:{ 
		url: rootUrl + '/api/public/guest',
		method: 'GET'
	},
	// 登录
	login:{  
		url: rootUrl + '/api/user/login',
		method: 'GET'
	}
}
로그인 후 복사

5.main.js 파일에 인터페이스 파일을 소개합니다

import App from './App'
// #ifndef VUE3
import Vue from 'vue'
Vue.config.productionTip = false;  //设置为 false ,可以阻止 vue 在启动时生成生产提示
App.mpType = 'app'
const app = new Vue({
	...App
})
app.$mount()
// #endif
// #ifdef VUE3
import {
	createSSRApp
} from 'vue'
import {
	toast,
	nav,
	checkMobile,
	onuploadFile
} from '@/api/functions.js'
import {
	api,
	rootUrl
} from '@/api/api.js' // API 链接
import {
	https
} from '@/api/http.js' // 请求方式中间件
import navigationBar from '@/components/navigationBar.vue'
import publicContext from '@/components/publicContext.vue'
export function createApp() {
	const app = createSSRApp(App)
	app.component('navigationBar', navigationBar);
	app.component('publicContext', publicContext);
	app.config.globalProperties.$toast = toast;
	app.config.globalProperties.$nav = nav;
	app.config.globalProperties.$add = add;
	app.config.globalProperties.$checkMobile = checkMobile;
	app.config.globalProperties.$isEmpty = isEmpty;
	app.config.globalProperties.$formatFloat = formatFloat;
	app.config.globalProperties.$api = api;
	app.config.globalProperties.$rootUrl = rootUrl;
	app.config.globalProperties.$http = https;
	app.config.globalProperties.$imgUrl = 'https://qianchao-sheke.oss-cn-hangzhou.aliyuncs.com/'
	return {
		app
	}
}
// #endif
로그인 후 복사

6.인터페이스 요청

this.$http(this.$api.messageList,{
					api_token:uni.getStorageSync('token'),
					pageSize:10,
                    page:1
				}).then(res=>{
					console.log(res,'返回参数');
				})
로그인 후 복사

그리고, 캡슐화된 전역 메서드인 위의 다섯 번째 단계는 메인 파일인

export function toast(title){
	uni.showToast({
		icon:'none',
		title:title,
		position:'bottom',
	})
}
//校验手机格式 
export function checkMobile(mobile){
	return RegExp(/^1[34578]\d{9}$/).test(mobile);
}
export function nav(url,type=0){
	if(type == 0){
		uni.navigateTo({
			url:url
		})
	}else if(type == 1){
		uni.switchTab({
			url:url
		})
	}else if(type == 3){
		uni.navigateBack({
		})
	}else if(type == 4){
		uni.redirectTo({
			url: url
		});
	}else if(type == 5){
		uni.reLaunch({
			url
		});
	}
}
// 上传图片
export function onuploadFile(){
	var _this = this;
	uni.chooseImage({
		count: 1, //默认9
		sizeType: ['original', 'compressed'],
		sourceType: ['album', 'camera'],
		success: (res) => {
			// console.log(res.tempFilePaths,'图片的本地文件路径列表',_this.$rootUrl);
			uni.uploadFile({
				url: _this.$rootUrl +'/api/public/upload',//上传图片的地址
				filePath: res.tempFilePaths[0],//这里是图片的本地文件路径列表(选择图片成功的时候可以拿到,在上边的success回调中res.tempFilePaths即可拿到)
				name: 'file',//上传的名字叫啥都行
				// headers: {
				// 	accessToken:'' //可以设置你的请求头的token噢
				// },
				success(res) {
					//上传成功的回调
					// console.log('上传成功',res)
					var data = JSON.parse(res.data);
					return data.data[0];
				},
				fail(err){
					console.log(err,'上传失败');
				},
				complete(result){
					console.log(result,'上传结果');
				}
			})
		}
	});
}
로그인 후 복사

vue3 인터페이스 요청 캡슐화

1에 도입되었습니다. 프로젝트

npm install --save axios vue-axios
로그인 후 복사

2에 axios를 설치합니다. src 폴더 .js 파일

uni-app vue3 인터페이스 요청을 캡슐화하는 방법

3.index.js 파일 코드

import axios from "axios";//创建一个axios的对象
import { useRouter } from "vue-router";
import { inject } from "vue";
//生成一个axios的实例
const http=axios.create({
	baseURL:"https://xxxx.test03.qcw800.com",// baseURL会在发送请求的时候拼接在url参数前面
	timeout:6000,//请求超时
});
// http.defaults.headers['api_token'] = localStorage.getItem('token') || '' //在请求头中传入token
http.interceptors.request.use(config => { 
    // console.log(config,'请求拦截');
  return config;
}, err => { 
  return Promise.reject(err)
})
//响应拦截器
http.interceptors.response.use(response => {
	//console.log(response,'响应拦截');
	return response;
  }, err => { 
	return Promise.reject(err)
  })
export default http;//导出
로그인 후 복사

4.api.js 파일 코드

//导入request.js
import request from "@/request/index";
//登录
export const login = (params) => request.get("/api/user/login",{params});
//获取个人信息
export const userDetail = (params) => request.get("/api/user/detail",{params});
//方法二 在api文件里出来异步请求
// export const getCategory=async()=>{
// 	const res=await request.get(`/category/`);
// 	return res.data;
// };
로그인 후 복사

5.인터페이스 요청

<script>
import { defineComponent,onMounted } from &#39;vue&#39;
import { userDetail } from &#39;@/request/api&#39;
export default defineComponent({
  setup() {
    onMounted(()=>{
      userDetail({api_token:localStorage.getItem(&#39;token&#39;)}).then(res=>{
            console.log(res,&#39;个人信息&#39;);
        })
    })
  }
})
</script>
로그인 후 복사

알고 계시나요? !

나중에 도메인 간 문제 및 프록시 코드에 대한 솔루션이 제공될 예정입니다

const { defineConfig } = require(&#39;@vue/cli-service&#39;)
module.exports = defineConfig({
  transpileDependencies: true,
  devServer: {
    port: 8080, // 端口号
    open: false, //配置是否自动启动浏览器
    https: false,// https:{type:Boolean}是否启用https
    proxy: {
      // 代理
      "/api": {
        target: "https://xxxx.test03.qcw800.com",     //要代理访问的路径
        changeOrigin: true,//开启代理:在本地会创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题
        ws: true,//是否启用websockets,用不到可设为false
        pathRewrite: {
          "^/api": ""//这里理解成用&#39;/api&#39;代替target里面的地址,比如我要调用&#39;http://192.168.0.45:8088/user/getuserlist&#39;,直接写&#39;/api/user/getuserlist&#39;即可
        }
      }
    }
  },
})
로그인 후 복사

위 내용은 uni-app vue3 인터페이스 요청을 캡슐화하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿