uni-app对接Spring Boot核心是确保header正确(Content-Type、Authorization等)、参数匹配后端接收方式(@RequestBody或@RequestParam)、跨域配置得当(开发用@CrossOrigin,生产用Nginx或WebMvcConfigurer),并能准确定位错误。

uni-app 对接 Java 后端接口,核心不是“能不能通”,而是“怎么让每次请求都带对 header、参数不丢、错误能定位”。只要后端是标准 Spring Boot REST 接口(返回 JSON),前端用 uni.request 就能调通;但真实项目里卡住的,90% 出在 header 漏配、跨域没关、token 放错位置、或后端没加 @CrossOrigin。
uni.request 发起请求时必须配哪些 header
Java 后端(尤其 Spring Boot)默认不接受任意来源请求,且常要求客户端声明来源和身份。光写 url 和 data 不够。
-
Content-Type:POST/PUT 传 JSON 时必须设为"application/json";若后端用@RequestBody接收,漏这个会 400 -
source-client:很多社交类后端(比如你知识库里的交友源码)靠这个区分小程序/App/H5 流量,值通常是"miniapp"或"app" -
Authorization:登录后调受保护接口时必传,格式一般是"Bearer your-jwt-token",注意大小写和空格 - 开发阶段可临时加
"X-Requested-With": "XMLHttpRequest"避开某些网关拦截(非必需,但有时救急)
Spring Boot 后端要开跨域,但别用 @CrossOrigin(origins = "*") 上生产
开发时在 Controller 方法上加 @CrossOrigin(origins = "*") 最快,但上线后微信小程序会因域名未备案而失败——它只认你填在微信公众平台「request 合法域名」里的地址。
- 开发环境:直接在 Controller 类或方法上加
@CrossOrigin(origins = "http://localhost:8080")(HBuilderX 默认端口) - 测试环境:把
origins换成你的测试域名,如"https://test-api.yourdomain.com" - 生产环境:关闭所有
@CrossOrigin,改用 Spring WebMvcConfigurer 全局配置,只放行小程序后台配置的合法域名(mp.weixin.qq.com不算,那是微信自己的) - 更稳妥的做法:Nginx 层统一加
Access-Control-Allow-Origin响应头,后端不处理跨域逻辑
表单提交后端收不到参数?检查 data 是对象还是字符串
uni.request 的 data 字段,如果后端用 @RequestBody 接收,前端必须传 JS 对象,uni 会自动序列化为 JSON;如果后端用 @RequestParam 或 @ModelAttribute,前端就得传 URL 查询字符串格式(key=value&key2=value2),且 Content-Type 得改成 "application/x-www-form-urlencoded"。
立即学习“Java免费学习笔记(深入)”;
- 后端用
@RequestBody User user→ 前端data: { username: "a", password: "b" }+header["Content-Type"] = "application/json" - 后端用
@RequestParam String username→ 前端data: "username=a&password=b"+header["Content-Type"] = "application/x-www-form-urlencoded" - 混用会 400 或参数为 null,看后端 Controller 方法签名决定前端怎么发
接口报 401 却没弹登录页?token 可能根本没发出去
常见现象:用户已登录,uni.setStorageSync("token", xxx) 存了,但调接口还是 401。大概率是请求拦截器没生效,或者 token 被拼错了。
- 检查是否调用了
uni.addInterceptor("request", ...),且拦截器里确实读取了 storage 并赋给了options.header.Authorization - 打印
options.header看 Authorization 字段是否存在,值是不是"Bearer xxx"(不是"token xxx"或"xxx") - 后端验证 token 时,常会忽略 Bearer 前缀,直接截取空格后部分,所以前端少写
"Bearer "就白传 - 小程序真机调试时,
uni.getStorageSync在某些版本有缓存 bug,建议加个 try-catch 并 fallback 到uni.getStorage异步读取
真正麻烦的从来不是“第一次调通”,而是 token 过期后怎么静默刷新、上传文件时 multipart boundary 怎么配、以及微信小程序里 uni.uploadFile 的 header 和 uni.request 不共享——这些细节不提前踩一遍,上线前两小时准炸锅。
















