uni-app一课一得 (请求接口方法详解+请求接口Promise写法)

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

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

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

在上面的图中,我们可以看到,我们想要的数据在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文件

我们先新建一个目录

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

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

设置.js文件

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

在这里面,我们就可以开始写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中引入它,这样整个项目都可以使用它了

这里做了几件事,

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)

### 回答1: 可以使用 uni.request 函数发起 HTTP 请求来获取图片数据。 具体方法是在 uni.request 中设置 responseType 为 'arraybuffer',然后将请求返回的二进制数据转换为 base64 编码并赋值给图片元素的 src 属性。 例如: ``` uni.request({ url: 'http://example.com/image.jpg', responseType: 'arraybuffer', success: (res) => { let base64 = wx.arrayBufferToBase64(res.data) let imageSrc = 'data:image/jpg;base64,' + base64 this.imageSrc = imageSrc } }) ``` 在模板中,可以使用 v-bind 指令将图片元素的 src 属性绑定到 imageSrc 变量上。 ``` <template> <view> <image v-bind:src="imageSrc"></image> </view> </template> ``` ### 回答2: 在uniapp中写接口返回图片数据,可以按照以下步骤进行操作: 首先,需要在后台服务器端编写接口用于返回图片数据。这个接口可以是使用任何编程语言实现的,比如PHP、Node.js等。接口的功能是获取图片的路径或者图片的二进制数据,并返回给前端应用。 1. 后台服务器端编写接口的代码如下(以Node.js为例): ```javascript const fs = require('fs'); const path = require('path'); const express = require('express'); const app = express(); app.get('/getImage', (req, res) => { const imagePath = path.join(__dirname, 'images', 'sample.jpg'); // 图片路径 // 读取图片的二进制数据 fs.readFile(imagePath, (err, data) => { if (err) throw err; // 设置响应头,指定返回的数据类型为图片 res.setHeader('Content-Type', 'image/jpeg'); // 返回图片数据 res.send(data); }); }); app.listen(3000, () => { console.log('Server is running on port 3000'); }); ``` 2. 运行上述代码,启动服务器。服务器将在3000端口监听请求。 3.uniapp中,可以使用uni.request方法发起请求获取图片数据。示例如下: ```javascript export default { methods: { getImageData() { uni.request({ url: 'http://localhost:3000/getImage', // 接口地址 method: 'GET', responseType: 'arraybuffer', // 设置返回数据的类型 success: (res) => { const base64Data = uni.arrayBufferToBase64(res.data); // 将返回的arraybuffer类型数据转为base64格式 this.imageData = `data:image/jpeg;base64,${base64Data}`; // 将base64格式数据赋值给前端展示的图片 } }); } } } ``` 4.uniapp页面中调用getImageData方法,发起请求并获取到图片数据后,将其赋值给前端展示的图片源,即可在前端页面中显示接口返回的图片数据。 通过以上步骤,就可以在uniapp中写接口返回图片数据,并在前端应用中展示图片。 ### 回答3: 在uniapp中,编写接口返回图片数据需要按照以下步骤进行操作: 首先,需要在后端服务器中创建接口来将图片数据返回给前端。可以使用Node.js、PHP、Java等后端语言来编写该接口。 接下来,在前端uniapp的代码中,可以使用uni.request函数来发送网络请求获取图片数据。这个函数可以发送HTTP请求到后端接口并获取返回的数据。 在uni.request函数中,需要设置请求的url为后端接口的地址,并指定请求方法(例如GET或POST)。同时,还可以设置请求头、请求参数等信息,以便服务器能够正确处理请求。 当接收到后端返回的图片数据后,可以在前端使用uni-app提供的相关组件(如<image>标签)来展示图片。可以将接收到的图片数据赋值给该组件的src属性,从而显示图片。 在图片展示的过程中,可以根据需要对图片进行进步处理,比如调整大小、裁剪、添加滤镜等操作。uni-app提供了丰富的组件和插件来实现这些功能。 最后,根据具体需求和业务逻辑,确定是否需要对接口进行其他的错误处理或数据处理操作。比如判断接口返回的状态码,处理图片加载失败的情况等。 总之,在uniapp中编写接口返回图片数据需要通过后端服务器创建接口前端发送网络请求、接收数据并在前端显示图片的过程来完成。通过合理的代码编写和组件使用,可以轻松实现该功能,并为用户提供良好的使用体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值