小白总结uniapp微信小程序跨域问题的解决(前端)

前言:本人前端小白一枚,在B站听了一个很不错的视频,关于uniapp Vue3超详细教程,有需要的小伙伴可以去听,受益匪浅,下面是该博主的链接:

gitee源码地址:https://gitee.com/qingnian8/uniapp-ling_project.git

官方推荐链接:动态-哔哩哔哩

本文参考链接:在uniapp Vue3版本中如何解决web/H5网页浏览器跨域的问题_uniapp webview跨域-CSDN博客

第一次写博客,主要是想分享与自己总结~(有问题还希望看到的小伙伴多多指教~)

下面直接进入正题,关于uniapp微信小程序的跨域解决:

什么是跨域

跨域指的是在浏览器中,当一个网页尝试加载另一个不同域名(或协议、端口号)下的资源时所面临的限制。

en,简单说,之所以存在跨域是因为不同源,什么是不同源呢,要知道同源策略

同源策略是一种安全机制,它限制了一个网页中加载的资源与当前页面本身来自同一来源的资源进行交互。这种策略保护了用户的信息安全,防止恶意网站通过 JavaScript 等方式获取到用户的敏感信息。

例如,如果一个网页(http://example.com)试图通过 JavaScript 代码加载另一个网页(http://anotherdomain.com)中的数据,这就属于跨域请求,浏览器会阻止这种操作。

错误提示像这种,就是跨域了

解决跨域

前提:你已经创建好了项目哦(HBuilder Vue3项目)

配置vite.config.js

打开HBuilder项目,创建一个新的名为“vite.config.js”的js文件,参考目录结构:

vite.config.js参考代码如下:

import { defineConfig } from 'vite';
import uni from '@dcloudio/vite-plugin-uni';

export default defineConfig({
  plugins: [uni()],
  server: {
    host: "localhost", // 指定服务器应该监听哪个IP地址,默认:localhost
    port: 7788,        // 指定开发服务器端口,默认:5173,端口号自己改
    proxy: {           // 为开发服务器配置自定义代理规则
       // 这个代理路径名称/wxapi自行修改,如/proapi
      "/wxapi": {
        target: "https://tiyu.baidu.com", // 目标接口,请求的根地址拿过来
        changeOrigin: true,            // 是否换源
        rewrite: (path) => path.replace(/^\/wxapi/, ""),
      }
    }
  }
});

因为小程序里没有代理,H5可以实现,但小程序我们还需以下配置

创建目录及文件

需要创建以下目录,以及相对应的js文件,目录结构如下:

配置各文件

//config.js

根据不同的平台设置API请求的URL和代理路径,common.js会用到

// 系统信息
export const SYSTEM_INFO = uni.getSystemInfoSync()


// 主机地址
export const HOST = 'https://tiyu.baidu.com';


// api服务器
export const API_HOST = SYSTEM_INFO.uniPlatform === 'web' ? '' : HOST;


// api服务代理路径
export const API_PROXY = SYSTEM_INFO.uniPlatform === 'web' ? '/wxapi' : ''

//common.js

因为小程序无代理,我们写一个packApiUrl()方法对传过来的url进行一个判断,如果是web,字符串拼接url,不是则不拼接还是原来的url,封装请求会用到此方法。

import {API_HOST,API_PROXY} from "../config.js"

/**
 * 组装接口url
 */
export const packApiUrl = (url = '') => {
  if (url.slice(0, 4) === 'http') return url
  else return `${API_HOST}${API_PROXY}${url}`
}

//request.js

导入上面的方法,封装网络请求

import {packApiUrl} from "./common.js"
export function request(config={}){	
	let {
		url,
		data={},
		method="GET",
		header={}
	} = config
	
	url =packApiUrl(url);		
	
	return new Promise((resolve,reject)=>{		
		uni.request({
			url,
			data,
			method,
			header,
			success:res=>{				
				if(res.data.status==0){
					resolve(res.data.data)
				}else{
					uni.showToast({
						title:res.data.message,
						icon:"none"
					})
					reject(res.data.data)
				}							
				
			},
			fail:err=>{
				reject(err)
			}
		})
	})
}

//api.js

//引入request请求
import {request} from "../utils/request.js"
//请求数据接口
export function apiNbaData(){
	return request({
		url:"/api/match/playerranking/match/NBA/tabId/60" //访问的接口	
	})	
}

示例

//index.vue

<template>
	<view class="container">	
		<view class="row" v-for="(item,index) in listData" :key="index">
			<image :src="item.logo" mode=""></image>
			<view>{{item.playerName}}</view>
		</view>
	</view>
</template>

<script setup>
	import {
		ref
	} from 'vue';
	import {
		apiNbaData
	} from "../../api/api.js"

	const listData = ref([])

	const getData = () => {
		apiNbaData().then(res => {
			console.log(res);
			listData.value = res.data
		})
	}
	getData();
</script>

<style scoped lang="scss">

</style>

效果图:

结语

所有代码可直接复制粘贴,接口是咸虾米_博主开源的,可以直接用,需要的最上边链接。

最后,打包上线还需nginx反向代理实现(我不会,还需继续学习)

  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Uniapp是一款基于Vue.js框架的跨平台开发工具,它支持同时开发多个平台的应用,其中包括微信小程序。在Uniapp中,我们可以使用uni.uploadFile()方法上传图片。 上传图片前,我们需要先获取到图片的本地路径,可以通过uni.chooseImage()方法选择图片并获取到本地路径: uni.chooseImage({ count: 1, success: function (res) { var tempFilePaths = res.tempFilePaths; } }); 接下来,我们就可以使用uni.uploadFile()方法上传图片了。具体参数说明如下: uni.uploadFile({ url: '上传接口的地址', filePath: '要上传的文件路径', name: '上传文件对应的 key', formData: {'其他额外的formdata'}, success: res => {}, fail: () => {}, complete: () => {} }); 其中,url为上传接口的地址;filePath为要上传的文件路径,即上一步获取到的本地路径;name为上传文件对应的key,可以根据后台的要求进行修改;formData为其他额外的formdata,可以根据后台的要求进行传递。success、fail和complete为上传成功、失败和完成后的回调函数。 上传图片需要注意的是,需要在微信小程序的后台配置好上传接口的请求域名并获取到上传的token等信息,否则上传会失败。 ### 回答2: 要实现uniapp微信小程序上传图片,我们需要了解一些相关的知识点和实现步骤。 首先,我们需要使用uniapp官方提供的wx.chooseImage()接口来获取用户选择的图片并且展示出来。代码如下: ``` uni.chooseImage({ count: 1, sizeType: ['original', 'compressed'], sourceType: ['album', 'camera'], success: (res) => { this.tempFilePaths = res.tempFilePaths[0] this.imgSrc = this.tempFilePaths } }) ``` 其中count表示选择的图片数量,sizeType表示图片尺寸,sourceType表示图片来源,success表示成功回调函数,tempFilePaths是选择的图片本地文件路径。 然后,在获取到图片路径后,我们需要借助wx.uploadFile()接口来实现上传图片。具体实现代码如下: ``` uni.chooseImage({ count: 1, sizeType: ['original', 'compressed'], sourceType: ['album', 'camera'], success: (res) => { this.tempFilePaths = res.tempFilePaths[0] this.imgSrc = this.tempFilePaths uni.uploadFile({ url: '上传图片的接口地址', filePath: this.tempFilePaths, name: 'file', formData: { 'user': 'test' }, success: (res) => { console.log(res) } }) } }) ``` 其中url是上传图片的接口地址,filePath是要上传的图片的本地文件路径,name表示上传图片对应的key值,formData表示要一起上传的数据,success表示成功回调函数。 需要注意的是,上传图片的接口地址和具体的formData数据格式需要我们自己根据后台需求来进行处理。 以上就是实现uniapp微信小程序上传图片的原理和具体实现步骤,可以根据具体需求进行修改和调整。 ### 回答3: Uniapp是一款基于Vue.js框架开发的跨平台应用开发框架,用它我们可以快速简单地开发出多种类型的应用。其中,Uniapp集成了微信小程序的功能,可以通过Uniapp开发界面,同时发布到多个平台,如微信小程序、H5、iOS和安卓等。 在Uniapp中,小程序上传图片涉及到两个方面,一个是前端页面的实现,另一个是后端的接收和处理。下面我们分别来看一下。 一、前端页面的实现 1.首先,我们需要在页面中引入uni-com*ponents组件: ```html <uni-com*ponents @choose="chooseImage" :count="1">选择图片</uni-com*ponents> ``` 其中,chooseImage是我们自定义的方法名,被触发时执行选择图片的功能。 2.接着,在js代码文件中定义chooseImage方法: ``` chooseImage() { uni.chooseImage({ count: 1, success: chooseResult => { uni.uploadFile({ url: 'http://localhost:3000/upload', filePath: chooseResult.tempFilePaths[0], name: 'image', formData: { user: '' }, success(uploadResult) { console.log(uploadResult.data); } }); } }); } ``` 这里我们使用uni.chooseImage选择图片,然后调用uni.uploadFile上传图片,其中url是后端接口地址,filePath是临时文件路径,name是上传文件的key值,formData是一些额外的参数,success为上传成功的回调函数。 二、后端接收和处理 后端接收和处理图片涉及到Node.js和Express框架的使用,这里我们简单介绍一下。 1.首先,在服务器端使用npm安装multer和cors插件,分别用于文件上传和跨域处理。 ``` npm install multer cors ``` 2.在Node环境下创建upload.js文件,引入express、multer和cors插件,并定义上传路径和上传文件大小限制等相关参数,代码如下: ``` const express = require('express'); const path = require('path'); const multer = require('multer'); const cors = require('cors'); const app = express(); app.use(cors()); const storage = multer.diskStorage({ destination: './uploads/', filename: function(req, file, cb) { cb(null, Date.now() + '-' + file.originalname); } }); const upload = multer({ storage: storage, limits: { fileSize: 1024 * 1024 * 2 } // 上传文件大小限制,默认为2MB }); app.post('/upload', upload.single('image'), function(req, res) { const file = req.file; if (!file) { const error = new Error('Please upload a file'); error.httpStatusCode = 400; return next(error); } res.send(file); }); app.listen(3000, function() { console.log('Server started on port 3000'); }); ``` 这里我们使用express框架创建了一个服务器,并通过multer中间件实现上传文件的功能,同时使用cors插件解决跨域问题。我们在/upload接口中通过upload.single()实现单文件上传,同时通过res.send返回上传成功的文件信息。 3.最后,我们启动Node.js服务器,在小程序中选择并上传图片,我们可以在控制台中看到文件上传的结果。 总结: 通过以上代码,我们可以实现Uniapp微信小程序上传图片的功能,其中主要分为前端页面的实现和服务器端的处理。在实际使用中,我们可以根据实际需求进行不同的调整和优化,以便更好地满足应用需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值