#原生态的请求接口写法
methods(){
    getSwiperList() {  //方法名
				uni.request({
					url: "你的数据接口",

					success: (res) => { //如果成功了
						// 打印数据
						console.log(res);
						// 如果请求成功,就把数据转存起来,方便页面使用
						this.swipeList = res.data.message; 
					},
					fail: (res) => {
						console.log('请求失败');
					    }
				    })
			    }
            }

console.log(res);中,res是请求接口返回的所有数据。你需要在res中,找到你所需的数据,你可以在控制台中观测到类似以下的数据结构

uniapp请求移后端springBoot接口403_数据

在上面的图中,我们可以看到,我们想要的数据在data下的message的里面(这是返回的数据),那我们就只需要按着数据结构写,就可以把接口数据赋值给this.swiperList了。

发起一个网络请求时,如果请求成功,这个API通常会提供一个响应对象作为回调函数的参数。在这个例子中,这个参数被命名为 res

所以,你现在能理解这行代码的意思了吗?

this.swipeList = res.data.message;

在这里面,this.swiperList是在Vue组件的data函数中定义的一个属性或数据项。用来存储请求接口获得的数据。

如下:

data() {
			return {
				swipeList: [], // 轮播图数据
			};
		},

请求到数据后,你得调用 getSwiperList()方法(为了得到数据后,在页面渲染),但我们一般不在页面代码中调用,根据项目的实际功能,我需要页面加载时后就调用getgetSwiperList()方法,所以,我们可以把这个方法放到onLoad()函数中,让它帮我们使用这个方法。

如下:

onLoad() {
			 this.getSwiperList(); // 获取轮播图数据 
		},

然后,我们就可以到页面上,渲染swiper的数据了。

原生态完整代码

下面是完整代码参考:

<template>
	<view>
        <view class="swiper-box">  
			<swiper :indicator-dots="true" :autoplay="true" :interval="3000"                     :duration="1000">
				<swiper-item class="swiper" v-for="(item,index) of swipeList" :key="index">
					<navigator :url="item.navigator_url">
						<!-- mode宽不变,高自动变化 -->
						<image :src="item.image_src" mode="widthFix"></image>	
						</navigator>
				</swiper-item>
			</swiper>
		</view>
	</view>
</template>



<script>
	export default {
		data() {
			return {
				swipeList: [], // 轮播图数据
			};
		},
		onLoad() {
			 this.getSwiperList(); // 获取轮播图数据 
		},
		methods: {
			
			// 轮播图请求(没有封装的)
			 getSwiperList() {
			 	uni.request({
			 		url: "请求接口",

			 		success: (res) => {
			 			// 打印数据
						console.log(res);
			 			// 把数据存起来
		 			    this.swipeList = res.data.message;
			 		},
			 		fail: (res) => {
			 			console.log('请求失败');
			 		}
			 	})
			 },
		}
	}
</script>
#接口的Promise写法

在开始之前,我们先思考,我们为什么不直接用原生态写法,而选择Promise写法呢?原因就在于,原生态写法太过于繁琐了,假如我们一个项目有多个接口,那我们每一个接口,就要写一个uni.request({})方法,而每个方法就要包含url、data、method、header,等等,这样代码很明显就变得多而杂,而用了Promise写法,在编写代码时,我们就可以使用async和await写法来简化请求接口代码了。

在写Promise前,我们要先创建一个.js文件 ,来放我们请求接口必写的和会用到的东西。

创建.js文件

我们先新建一个目录

uniapp请求移后端springBoot接口403_数据_02

给这个目录取名(取什么名都可以)

uniapp请求移后端springBoot接口403_ide_03

然后在shop-js目录下建.js文件

uniapp请求移后端springBoot接口403_数据_04

设置.js文件

uniapp请求移后端springBoot接口403_uni-app_05

这之后就可以获得一个空白的.js文件了

uniapp请求移后端springBoot接口403_ide_06

在这里面,我们就可以开始写param写法的请求接口了

Promise方法写请求接口

我们分段来看

export default (param) => {}
export default (param) => {}

这里的param英语翻译是参数的意思,它的作用也是当作一个请求参数,它是一个对象类型的请求参数

然后在里面写上请求接口要用上的东西

export default (param) => {
     var url = param.url,
		// 若在使用的那边写有method,那么就用写有的那个,没写有就默认get
		method = param.method||'get', //默认为Get
		header =param.header|| {},//请求头
		data = param.data || {},  //向服务器接口发请求时发送的数据 ,对象类型
		token = param.token || "",
		hideLoading = param.hideLoading || false; //隐藏加载动画
    }

在uni-app官方网站,请求接口的方法,会有几个常用的参数名(原生态写法)

url 、data 、method 、header

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

解释一下这里的代码:

export default (param) => {
      var url = param.url,
         // 若在使用的那边写有method,那么就用写有的那个,没写有就默认get
         method = param.method||'get', //默认为Get        //这里的请求头后面有些,如果没有请求头,就默认为空对象{}
         header =param.header|| {},//请求头        \\以下同上
         data = param.data || {},  //向服务器接口发请求时发送的数据 ,对象类型
         token = param.token || "",
         hideLoading = param.hideLoading || false; //隐藏加载动画
     }
url

因为我这个项目是多个接口,接口是一体的,所以我需要拼接url,这里面 const baseUrl = 你接口的公共部分

而下面的requestUrl =你接口的公共部分 + 你在页面里写的url的独特部分(就是 url = param.url),

export default (param) => {
     var url = param.url,
		// 若在使用的那边写有method,那么就用写有的那个,没写有就默认get
		method = param.method||'get', //默认为Get
		header =param.header|| {},//请求头
		data = param.data || {},  //向服务器接口发请求时发送的数据 ,对象类型
		token = param.token || "",
		hideLoading = param.hideLoading || false; //隐藏加载动画

        //拼接完整请求地址
	    const baseUrl = 'https://api-接口公共部分'
	    var requestUrl = baseUrl + url;
    }

什么是接口公共部分?

以这个举例 url: 'https://www.example.com/request', //仅为示例,并非真实接口地址。

https://www.example.com/request这是公共部分,而完整的接口可能是这样的

接口1:https://www.example.com/request/sreach    //搜索接口

接口2:https://www.example.com/request/detail        //详情接口

method & header

然后是method,请求头根据method的不同 ,而有不同的请求头

// param:对象类型,请求参数
export default (param) => {
	// uni.request(OBJECT): 参考官网   OBJECT:请求参数	
	    var url = param.url,
		// 若在使用的那边写有method,那么就用写有的那个,没写有就默认get
		method = param.method||'get', //默认为Get
		header =param.header|| {},//请求头
		data = param.data || {},  //向服务器接口发请求时发送的数据 ,对象类型
		token = param.token || "",
		hideLoading = param.hideLoading || false; //隐藏加载动画

	//拼接完整请求地址
	const baseUrl = 'https://api-接口公共部分'
	var requestUrl = baseUrl + url;

	//请求方式:GET或POST
	//POST方式需配置为: header: {'content-type' : "application/x-www-form-urlencoded"},)
	if (method) {
		method = method.toUpperCase(); //转换为大写
		if (method == "POST") {
			header = {
				'content-type': "application/x-www-form-urlencoded"
			};
		} else {
			header = {
				'content-type': "application/json"
			};
		}
	}
}

这里的加载动画就不解释了,不是重点

//加载圈
	if (!hideLoading) {
		//显示加载动画
		uni.showLoading({
			title: '加载中...'
		});
	}
返回promise

前面是准备工作的准备工作,接下来只要一个萝卜一个坑,把前面设置好的url,data,method...放进uni.request({ })就好了,加载动画这个可写可不写。后面就是判断,请求接口是否成功的代码,一般请求接口用,code判断:200就是成功,不等于200错误(请求接口失败),uni.showToast方法是用于输出信息的。

若请求成功,就

// 将结果抛出
                resolve(res.data)  

return new Promise((resolve, reject) => {
		// 发请求
		uni.request({
			url: requestUrl,
			data: data,
			method: method,
			header: header,
			success: (res) => {
				uni.hideLoading();//隐藏加载动画
				// console.log(res)
				// 判断 请求api 格式是否正确
				if (res.statusCode && res.statusCode != 200) {
					uni.showToast({
						title: "api错误" + res.errMsg,
						icon: 'none'
					});
					return;
				}
				// code判断:200成功,不等于200错误
				if (res.data.meta.status) {
					if (res.data.meta.status != '200') {
						uni.showToast({
							title: "" + res.data.meta.msg,
							icon: 'none'
						});
						return;
					}
				}
				// 将结果抛出
				resolve(res.data)
			},
			//请求失败
			fail: (e) => {
				uni.hideLoading();//隐藏加载动画
				// console.log(e)
				uni.showToast({
					title: "" + e.data.msg,
					icon: 'none'
				});
				reject(e.data);
			}
			
		})
	})
完整的.js文件
// param:对象类型,请求参数
export default (param) => {
	// uni.request(OBJECT): 参考官网   OBJECT:请求参数	
	    var url = param.url,
		// 若在使用的那边写有method,那么就用写有的那个,没写有就默认get
		method = param.method||'get', //默认为Get
		header =param.header|| {},//请求头
		data = param.data || {},  //向服务器接口发请求时发送的数据 ,对象类型
		token = param.token || "",
		hideLoading = param.hideLoading || false; //隐藏加载动画

	//拼接完整请求地址
	const baseUrl = 'https:你接口的公共部分'
	var requestUrl = baseUrl + url;

	//请求方式:GET或POST
	//POST方式需配置为: header: {'content-type' : "application/x-www-form-urlencoded"},)
	if (method) {
		method = method.toUpperCase(); //转换为大写
		if (method == "POST") {
			header = {
				'content-type': "application/x-www-form-urlencoded"
			};
		} else {
			header = {
				'content-type': "application/json"
			};
		}
	}

	//加载圈
	if (!hideLoading) {
		//显示加载动画
		uni.showLoading({
			title: '加载中...'
		});
	}

	// 返回promise
	return new Promise((resolve, reject) => {
		// 发请求
		uni.request({
			url: requestUrl,
			data: data,
			method: method,
			header: header,
			success: (res) => {
				uni.hideLoading();//隐藏加载动画
				// console.log(res)
				// 判断 请求api 格式是否正确
				if (res.statusCode && res.statusCode != 200) {
					uni.showToast({
						title: "api错误" + res.errMsg,
						icon: 'none'
					});
					return;
				}
				// code判断:200成功,不等于200错误
				if (res.data.meta.status) {
					if (res.data.meta.status != '200') {
						uni.showToast({
							title: "" + res.data.meta.msg,
							icon: 'none'
						});
						return;
					}
				}
				// 将结果抛出
				resolve(res.data)
			},
			//请求失败
			fail: (e) => {
				uni.hideLoading();//隐藏加载动画
				// console.log(e)
				uni.showToast({
					title: "" + e.data.msg,
					icon: 'none'
				});
				reject(e.data);
			}
			
		})
	})
}
引入.js 使用.js

写完js文件后,我们要用它呀,怎么用呢?在全局文件main.js中引入它,这样整个项目都可以使用它了

uniapp请求移后端springBoot接口403_前端_07

这里做了几件事,

1.从'shop-js/shop.js'模块中导入了shop

2.使用Vue.prototype.$Shop = shop ;将shop附加到Vue的原型上,并命名为$Shop

然后,你就可以在Vue的任何组件中(或页面),通过this.$Shop来访问shop对象的属性和方法。

 页面使用.js

那么页面怎么使用.js呢?

通过上面我们知道,通过this.$Shop来访问,但我们该怎么写在页面上呢?用async 、 await方法

如下:

<template>
	<view>
        <view class="swiper-box">  
			<swiper :indicator-dots="true" :autoplay="true" :interval="3000"                     :duration="1000">
				<swiper-item class="swiper" v-for="(item,index) of swipeList" :key="index">
					<navigator :url="item.navigator_url">
						<!-- mode宽不变,高自动变化 -->
						<image :src="item.image_src" mode="widthFix"></image>	
						</navigator>
				</swiper-item>
			</swiper>
		</view>
	</view>
</template>



<script>
	export default {
		data() {
			return {
				swipeList: [], // 轮播图数据
			};
		},
		onLoad() {
                this.getData();//获取全部数据
			 //this.getSwiperList(); // 获取轮播图数据 

		},
		methods: {
			
			// 轮播图请求(没有封装的)
			// getSwiperList() {
			//	uni.request({
			// 		url: "请求接口",

			// 		success: (res) => {
			// 			// 打印数据
			//			console.log(res);
			// 			// 把数据存起来
		 	//		    this.swipeList = res.data.message;
			// 		},
			// 		fail: (res) => {
			// 			console.log('请求失败');
			// 		}
			// 	})
			// },


                async getData(){
                    const res1=await this.$Shop({
					url:"接口的独特部分"
				})
                //打印数据
				console.log(res1);
                //转存数据  
				this.swipeList=res1.message;

                }
		}
	}
</script>

通过原生态的方法和Promise方法的对比,就可以看出代码的简洁了。

#总结

Promise接口写法的步骤:

1.创建目录和.js文件

2.在.js文件中写入接口请求必要的东西

3.在main.js中引入.js文件

4.页面通过async方法和this.$Shop来使用.js文件

最后,在这里放个uni-app的官网,方便学习uni-app的uni.request

uni.request(OBJECT) | uni-app官网 (dcloud.net.cn)