当前位置: 首页 > news >正文

【微信小程序】分别解决H5的跨域代理问题 和小程序正常不需要代理问题

——总问:何为跨域和代理?

🔹什么叫跨域?

前端在浏览器里发请求时,如果 域名 / 协议 / 端口 三个中有一个不一样,就会触发 跨域问题

例子:

  • 页面跑在 http://localhost:5173
  • 你要请求接口 http://100.100.1.60:29083/api/xxx

因为 端口号不一样(5173 ≠ 29083),所以就跨域了。
浏览器出于 安全机制(同源策略),会拦截掉不合法的请求,报 CORS 错误。


🔹什么叫代理?

代理(proxy)就是在前端本地开发环境下,给你“搭个中转站”。

比如 vite / vue-cli 里,可以这样写:

// vite.config.js
export default defineConfig({server: {proxy: {'/api': {target: 'http://100.100.1.60:29083', // 真实后端地址changeOrigin: true, // 修改请求头的来源rewrite: (path) => path.replace(/^\/api/, '') // 去掉/api前缀(可选)}}}
})

这样你前端调用:

fetch('/api/system/hospital/list')

浏览器看到 /api 觉得是本地的,不会跨域。
Vite 开发服务器帮你偷偷转发到:

http://100.100.1.60:29083/system/hospital/list

所以 代理的本质就是前端开发服务器代你转发请求,骗过浏览器,绕开跨域。


🔹其他结论:
在这里插入图片描述


—— 写法:

1.配置

配置写在 manifest.json 的源码视图 里面

  • 什么是 manifest.json
    在 Uni-App 项目里,manifest.json 就是一个 全局配置清单,决定了你项目在不同端(H5、小程序、App)的打包、运行、权限、启动页等核心信息。

🔹因为 不同端(H5、App、小程序)有各自的差异化设置,官方就统一放在 manifest.json 里:
1.App打包:图标、启动页、签名、权限(camera、storage、gps)等
2.小程序:appid、是否校验 URL、分包配置
3.H5:路由模式(hash/history)、发布路径
4.公共信息:应用名称、版本号、appid

👉 所以如果你需要:
1.配置 App 权限(比如用到相机、麦克风)
2.配置 小程序 appid
3.配置 打包图标、启动页
4.配置 H5 发布路径
🔹这些都要写在 manifest.json 的源码视图里。

  • 为什么不写在request里:
    在这里插入图片描述
  • 为什么写在 manifest.json
    在这里插入图片描述

🔹如图:

在这里插入图片描述

在这里插入图片描述

	/* H5端配置 */"h5": {"devServer": {"proxy": {"/api": {"target": "http://100.100.1.60:29083", // 👉 你的后端地址"changeOrigin": true,"secure": false,"pathRewrite": {"^/api": "" // 去掉前缀 /api}}}}},

🔑 secure 的意思:
1.secure: true(默认) → 代理的时候 只接受有效 HTTPS 证书
2.secure: false → 即使后端用的是 自签名证书 / 无效证书,也允许代理过去
👉 一般 本地开发环境 或者 测试服务器用自签名证书 时会写 false,不然代理会报错。
👉 如果你们后端是 http://,写不写 secure:false都无所谓,因为只在 https:// 后端生效。

2. 区分使用

🔹request: 区分使用 h5小程序

// utils/request.js// 后端服务地址(App 和小程序直连时用)
const BASE_URL = 'http://127.0.0.1:8080'// 统一请求封装
export default function request(options = {}) {let url = options.url// 判断环境// H5:支持 devServer 代理,直接走 /api// 非 H5(App、小程序):拼接完整 BASE_URL// #ifdef H5if (!url.startsWith('/api')) {url = '/api' + url}// #endif// #ifndef H5if (!url.startsWith('http')) {url = BASE_URL + url}// #endifreturn new Promise((resolve, reject) => {uni.request({url: url,method: options.method || 'GET',data: options.data || {},header: options.header || {'Content-Type': 'application/json',},success: (res) => {if (res.statusCode === 200) {resolve(res.data)} else {reject(res)}},fail: (err) => {reject(err)},})})
}

🔹解释:

// #ifdef H5
if (!url.startsWith('/api')) {url = '/api' + url
}
// #endif

👉 只在 H5 环境生效(浏览器开发)。
因为浏览器有跨域问题,这里会强制给你的请求地址加上 /api 前缀。
这样就能配合 Vite 或 Vue CLI 的代理(/api → http://127.0.0.1:8080),解决跨域。


// #ifndef H5
if (!url.startsWith('http')) {url = BASE_URL + url
}
// #endif

👉 非 H5 环境生效(App / 小程序)。
它们没跨域问题,所以直接拼接真实的 BASE_URL。
比如:
/system/hospital/list → http://127.0.0.1:8080/system/hospital/list


🔹整体逻辑

  • 在 H5(浏览器)环境:
    请求统一走 /api,通过 代理转发到后端。
  • 在 App / 小程序环境:
    直接拼上 BASE_URL,直连后端。

这样,你在项目里调用:

request({ url: '/system/hospital/list', method: 'POST' })

在不同环境下会自动处理:

  • H5:发的是 /api/system/hospital/list(再被代理转发)
  • 小程序:发的是 http://127.0.0.1:8080/system/hospital/list
http://www.dtcms.com/a/352960.html

相关文章:

  • 利用python脚本从dockerhub上下载镜像,可以选择arm架构还是x86架构
  • 福建地区通信安全员考试题库及答案
  • 基于FPGA的情绪感知系统设计方案:心理健康监测应用(四)
  • FPGA入门学习路径
  • Go变量作用域全解析
  • Zynq介绍和命名方式
  • FPGA学习笔记——Verilog中可综合和不可综合语句
  • 德克西尔氢气探测器:工业安全守护核心
  • 【Linux】用户与用户组管理
  • 6.8 学习ui组件方法和Element Plus介绍
  • 嵌入式C语言进阶:高效数学运算的艺术与实战
  • Java全栈开发面试实战:从基础到微服务架构的深度解析
  • 革新固态电池失效分析技术:AFM-SEM联用技术助力突破瓶颈
  • Java 大视界 -- Java 大数据机器学习模型在电商推荐系统冷启动问题解决与推荐效果提升中的应用(403)
  • Unity Shader unity文档学习笔记(二十一):几种草体的实现方式(透明度剔除,GPU Instaning, 曲面细分+几何着色器实现)
  • Axios 整理常用形式及涉及的参数
  • Vue3 + Vue Router 实现动态面包屑导航(支持点击跳转)
  • Techub News 与 TOKENPOST 达成战略合作以推动中韩 Web3 资讯互通
  • 有鹿机器人如何用科技与创新模式破解行业难题
  • 「LangChain 学习笔记」LangChain大模型应用开发:模型链(Chains)
  • 外汇中高频 CTA 风控策略回测案例
  • 宝塔面板零基础搭建 WordPress 个人博客与外贸网站 | 新手10分钟上手指南
  • 国内股指期货合约的最小变动价位是多少?
  • 大语言模型的“引擎室”:深入剖析现代计算与算法优化
  • 企业落地版 AutoGen 工程示例:自动化市场分析报告生成系统
  • 代码随想录刷题Day42
  • 【芯片低功耗设计中的UPF:从理论到实践详解】
  • windows 子系统 wsl 命令的用法
  • lvgl(一)
  • Java全栈工程师面试实录:从基础到实战的深度技术探索