uniapp(四) 之还原网络请求以及接口封装

news2024/11/16 13:25:45

通过uniapp官网,不难发现简单的接口请求格式

uni.request({
    url: 'https://www.example.com/request', //仅为示例,并非真实接口地址。
    data: {
        text: 'uni.request'
    },
    header: {
        'custom-header': 'hello' //自定义请求头信息
    },
    success: (res) => {
        console.log(res.data);
        this.text = 'request success';
    }
});

所带参数声明 

参数名类型必填默认值说明平台差异说明
urlString开发者服务器接口地址
dataObject/String/ArrayBuffer请求的参数App 3.3.7 以下不支持 ArrayBuffer 类型
headerObject设置请求的 header,header 中不能设置 RefererApp、H5端会自动带上cookie,且H5端不可手动修改
methodStringGET有效值详见下方说明
timeoutNumber60000超时时间,单位 msH5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)、微信小程序(2.10.0)、支付宝小程序
dataTypeStringjson如果设为 json,会对返回的数据进行一次 JSON.parse,非 json 不会进行 JSON.parse
responseTypeStringtext设置响应的数据类型。合法值:text、arraybuffer支付宝小程序不支持
sslVerifyBooleantrue验证 ssl 证书仅App安卓端支持(HBuilderX 2.3.3+),不支持离线打包
withCredentialsBooleanfalse跨域请求时是否携带凭证(cookies)仅H5支持(HBuilderX 2.6.15+)
firstIpv4BooleanfalseDNS解析时优先使用ipv4仅 App-Android 支持 (HBuilderX 2.8.0+)
enableHttp2Booleanfalse开启 http2微信小程序
enableQuicBooleanfalse开启 quic微信小程序
enableCacheBooleanfalse开启 cache微信小程序、字节跳动小程序 2.31.0+
enableHttpDNSBooleanfalse是否开启 HttpDNS 服务。如开启,需要同时填入 httpDNSServiceId 。 HttpDNS 用法详见 移动解析HttpDNS微信小程序
httpDNSServiceIdStringHttpDNS 服务商 Id。 HttpDNS 用法详见 移动解析HttpDNS微信小程序
enableChunkedBooleanfalse开启 transfer-encoding chunked微信小程序
forceCellularNetworkBooleanfalsewifi下使用移动网络发送请求微信小程序
enableCookieBooleanfalse开启后可在headers中编辑cookie支付宝小程序 10.2.33+
cloudCacheObject/Booleanfalse是否开启云加速(详见云加速服务)百度小程序 3.310.11+
deferBooleanfalse控制当前请求是否延时至首屏内容渲染后发送百度小程序 3.310.11+
successFunction收到开发者服务器成功返回的回调函数
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

method 有效值

注意:method有效值必须大写,每个平台支持的method有效值不同,详细见下表。

methodAppH5微信小程序支付宝小程序百度小程序字节跳动小程序、飞书小程序快手小程序京东小程序
GET
POST
PUTxxx
DELETExxxx
CONNECTxxxxxx
HEADxxxx
OPTIONSxxxx
TRACExxxxxx

准备工作就绪,咱们开始封装接口吧

  • 将接口按照method封装为方法,设置头部
  • 配置环境
  • 设置service文件
  • 接口调用
  • 添加请求拦截机制,非法请求跳转到登录页面

一、封装method方法-创建request.ts文件

先配置一个辅助的文件,存储cookie(如果头部要有cookie的话,utils是我自己创建的工具文件夹)

 

 

/**
* @description 权限存储函数
*/

export function getAuthorization() {
	return uni.getStorageSync('authorizationKey')
}

export function setAuthorization(authorization) {
	return uni.setStorageSync('authorizationKey',authorization);
}

export function removeAuthorization(authorization) {
	return uni.removeStorageSync('authorizationKey')
}

创建一个request文件 

 

 


import { getAuthorization } from '@/utils/auto'
//请求头,初始值,设置后不单独添加的话会存在不刷新不更新问题
let header = {
	'Content-type': 'Application/json',
	'Cookieid':'',
}

//生成请求方法
const request = (url,data,method) => {
    // 如果要添加头部的话
	header.Cookieid = getAuthorization()
    // 封装的方法
	return new Promise((resolve, reject) => {
	    uni.request({
	        url: url,
	        data: data,
	        header: header,
	        method: method,
	        success: res => {
	            resolve(res)
	        },
	        fail: err => {
	            reject(err);
	        }
	    })
	})
}

//创建HTTP对象,分化请求
class Http {
	get = function(url,data){
		return request(url,data,'GET')
	}
	post = function(url,data){
		return request(url,data,'POST')
	}
}

//实例化对象
const http = new Http()

//导出http对象
export{
	http
}

二、配置环境

肯定环境不一样,会有开发环境啊,测试环境啊,线上环境啊,我这里举例两个吧

 

// 开发环境 environment.prod.ts
const env = {

	//后台测试
	restHost: 'https://xxx1.com',
	// 实验室测试
	labHost: 'https://xxx2.com',
	// 手机测试
	scrmHost: 'https://xxx3.com',
}

export default{
	env
}
// 线上环境 environment.web.ts
const env = {
	
	//后台测试
	restHost: 'https://ssss.com',
	// 实验室测试
	labHost: 'https://dddd.com',
	// 手机测试
	scrmHost: 'https://ffff.com',
}

export default{
	env
}
import  Prod  from './environment.prod';
import  Web  from './environment.web';

const envArr = [
	Web.env,
	Prod.env
	]
// 判断开发环境
const production = 1;

const environment:any = envArr[production];

export {
	environment
}

好了都写差不多了,该根据模块写接口了

三、设置service文件

 

//导入API地址 login.service.ts
import  {environment}  from '@/environments/environment';
import { http } from '@/https/request';

class UserInfo {
	API_URL = environment.restHost;
	//----------> 登录页面
	// 账号密码登录登录
	login = `${this.API_URL}/User/login`;
	
}
const userInfo = new UserInfo();

const userLogin = (data) => {
    return http.post(userInfo.login, data);
}
//进行引入
export default{
	userLogin
}

 四、接口调用

import LoginApis from './login.service';
const submit = () => {
		loginform.value.validate().then(data => {
			LoginApis.userLogin(data).then((res:any) => {
				if(res.data.isSuccess){
					 uni.switchTab({
			            url: '../index/index'
		                });
				}else{
					uni.showToast({
					title: res.data.message,
					icon: 'none'
					})
				}
			})


		}).catch(err => {
			console.log('表单错误信息:', err);
		})
	}

五、顺便添加一个路由拦截吧

 

 

/**
* @description 自定义路由拦截
*/

import { getAuthorization } from '@/utils/auto'

// 白名单
const whiteList = [
	'/', // 注意入口页必须直接写 '/'
	{ pattern: /^\/pages\/login.*/ }, // 登录页面不校验
	{ pattern: /^\/pages\/privacy.*/ }, // 隐私保护页面不校验
	{ pattern: /^\/pages\/index.*/ }, // 首页不校验
	// '/pages/index/...',
	{ pattern: /^\/pages\/login\/*/ }
]

export default async function() {
	const list = ['navigateTo', 'redirectTo', 'reLaunch', 'switchTab']
	// 用遍历的方式分别为,uni.navigateTo,uni.redirectTo,uni.reLaunch,uni.switchTab这4个路由方法添加拦截器
	list.forEach(item => {
		uni.addInterceptor(item, {
			invoke(e) {
				// 获取要跳转的页面路径(url去掉"?"和"?"后的参数)
				const url = e.url.split('?')[0]
				console.log('url', url,e)

				// 判断当前窗口是白名单,如果是则不重定向路由
				let pass
				if (whiteList) {
					pass = whiteList.some((item) => {
						if (typeof (item) === 'object' && item.pattern) {
							return item.pattern.test(url)
						}
						return url === item
					})
				}

				// 不是白名单并且没有token,需要判断cookie是否存在
				if (!pass && !getAuthorization()) {
					uni.showToast({
					title: '登录信息失效',
					icon: 'none'
					})
					uni.navigateTo({
					url: "/pages/login/login"
					})
					
					return false
				}
				return e
			},
			fail(err) { // 失败回调拦截
				console.log(err)
			}
		})
	})
}

使用他

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/623512.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零基础想学黑客?推荐你了解一下Kali Linux!(建议收藏)

最近好多朋友问我:不会编程,英语也不好,dos命令也记不住,能学习黑客技术么? 我可以明确告诉大家,可以的! 相信每一个少年心中,曾经都有过一个黑客梦! 有人觉得黑客霸气…

5.1 合并数据

5.1 合并数据 5.1.1 堆叠合并数据1、横向堆叠 concat()2、纵向堆叠 concat()和append() 5.1.2 主键合并数据 merge()和join()5.1.3 重叠合并数据 combine_first() 5.1.1 堆叠合并数据 堆叠就是简单地把两个表拼在一起,也被称作轴向连接、绑定或连接。依照连接轴的方…

U盘 PE系统制作教程(附pe启动教程+获取方式)

目录 软件介绍: 软件安装步骤: 01 02 03 04 05 06 07 08 09 附:u盘pe系统启动教程 01 02 03 软件介绍: 微 PE 工具箱 v2.2 是一款免费纯净、无捆绑软件、体积小巧、功能齐全的PE 系统,微PE工具箱 v2.2 …

正大国际期货与国内期货的区别

一:定义 国际期货:是指交易所建立在中国大陆以外的期货交易,以美国,英国,新加坡等交易所内的产品为常见交易期货合约。有些期货合约品种会对国内期货价格变动产生影响,所以国内投资者可以参考国际期货行情…

科普:python怎么添加命令行参数

目录 1. 安装click2. 官方例子,快速入门3. 使用Group实现命令选择4. 使用click.option对指定命令的入参进行详细配置4.1 指定 type4.1.1 指定type是某种数据类型4.1.2 指定type限定可选值4.1.3 指定type限定参数的范围 4.2 指定命令行参数接收的值的个数4.3 输入密码…

导出下拉列表的两种小技巧【EasyPoi实战系列】- 第473篇

历史文章(文章累计460) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 用…

【SVN】windows下的SVN客户端访问ubuntu下的SVN服务器

目录 第一部分 windows创建本地版本库、连接ubuntu的SVN服务器 步骤0: 步骤一:创建windows本地版本库 步骤二:checkout检测 步骤三:输入之前配置的用户名和密码 第二部分 windows上传文件至SVN服务器 步骤一:添加…

python基础学习2【numpy生成数组+random随机数生成+索引+拼接+切割【jupyter学习】】

接上一期jupyter结尾的一小部分: 这四个用好了,排版得好你的代码看起来就像一篇文章一样~ 导出功能: NumPy数值计算基础 NumPy数组对象ndarray(存储单一数据类型的多维数组): 属性 说明ndim返回int,表示数…

记录一次 bin/rails db:migrate 报错

theme: condensed-night-purple bin/rails db:migrate 最近在倒腾后端,用的是 Ruby on Rails,数据库是 Postgres,在执行数据库迁移命令(bin/rails db:migrate)时,模型更新出错了 :( bin/rails db:migrate:status 提示说&#xff0…

毕业生高频常用材料线上签,高校毕业季契约锁电子签章一站式助力

据人社部消息,2023年全国高校毕业生总规模将达1158万人!毕业季开启,全国各地高校普遍面临三方协议、成绩单、证书、证明等毕业生高频常用材料签署量激增的现状。学生、教职工、学校常常疲于应对机械化的材料盖章工作。 #毕业季高频常用材料清…

剑走偏锋,正经程序员都在用的无头浏览器到底有多神奇?

浏览器是再熟悉不过的东西了,几乎每个人用过,比如 Chrome、FireFox、Safari,尤其是我们程序员,可谓开发最强辅助,摸鱼最好的伴侣。 浏览器能干的事儿,无头浏览器都能干,而且很多时候比标准浏览…

主动发现系统稳定性缺陷:混沌工程 | 京东云技术团队

这是一篇较为详细的混沌工程调研报告,包含了背景,现状,京东混沌工程实践,希望帮助大家更好的了解到混沌工程技术,通过混沌工程实验,更好的为系统保驾护航。 一、概述 1.1 研究背景 Netflix公司最早系统化…

SpringBoot自动配置的模版引擎

文章目录 目录 一、Thymeleaf 1.什么是Thymeleaf? 2.什么是模版引擎? 3.JAVA中的SPI(Service Provider interface)机制? 4.META-INF目录是干嘛用的? 总结 前言 一、Thymeleaf 1.什么是Thymeleaf? hymeleaf是试用于Web和独立环境的现代服务器端Java模版引擎 目的:…

使用Photoshop证件照制作

利用Photoshop从普通照片制作出证件照 先取一张普通照片 首先新建一个证件照的图片 分辨率350dpi尺寸大小26mm32mm像素大小358像素(宽)441像素 颜色模式24位RGB真彩色 1,抠图,用魔棒工具三秒钟搞定,如果不太复杂的图像…

USB EHCI知识点

1 EHCI和Companion UHCI端口切换 1.1 ICH6 EHCI 如果PCI控制器包括了伴随控制器,那么USB 2.0 HC(Host Controller)必须作为一个多功能PCI设备使用。伴随HC的功能码必须小于EHCI HC功能码。如果一个 PCI设备仅仅包括一个EHCI控制器&#xff08…

一站式完成车牌识别任务:从模型优化到端侧部署

交通领域的应用智能化不断往纵深发展,其中最为成熟的车牌识别早已融入人们的日常生活之中,在高速公路电子收费系统、停车场等场景中随处可见。一些企业在具体业务中倾向采用开源方案降低研发成本,但现有公开的方案中少有完成端到端的车牌应用…

Blindly Assess Image Quality in the Wild Guided by ASelf-Adaptive Hyper Network

Abstract 真实失真图像的盲图像质量评估(BIQA)一直是一个具有挑战性的问题,因为在野外采集的图像包含各种各样的内容和各种类型的失真。目前绝大多数的BIQA方法都专注于如何预测合成图像的质量,但当应用于真实世界的失真图像时却失败了。为了应对这一挑…

Android Activity和Fragment的对比

参考来源 参考来源 参考来源 状态方法对比 onAttach() 作用:fragment已经关联到activity,这个时候 activity已经传进来了, 获得activity的传递的值 就可以进行 与activity的通信里, 当然也可以使用getActivity(),前提是这个fragm…

在CSDN逮到一个阿里10年老测试,聊过之后收益良多...

老话说的好,这人呐,一但在某个领域鲜有敌手了,就会闲得蛋疼。 前几天我在上班摸鱼刷CSDN的时候认识了一位阿里测试大佬,在阿里工作了10年,因为本人天赋比较高,平时工作也兢兢业业,现在企业内有…

ChatGPT - 基于 ChatGLM-6B 搭建私有 ChatGPT 在线聊天服务

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/131104546 Paper:GLM: General Language Model Pretraining with Autoregressive Blank Infilling 一篇于2022年发表在ACL会…