尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
SpringBoot系列06:RESTful接口开发,请求参数接收、全局跨域CORS完整配置
SpringBoot系列06RESTful接口开发请求参数接收、全局跨域CORS完整配置✅ 系列专栏SpringBoot零基础进阶实战系列✅ 适配版本SpringBoot 3.x / Java 17✅ 核心亮点零基础上手、全覆盖参数接收、三种全局CORS配置、生产级避坑、可直接复用✅ 阅读收益彻底掌握RESTful接口规范、所有请求参数接收场景、解决前后端99%跨域问题一、前言为什么必须学RESTful与CORS配置在前后端分离开发模式中RESTful API是目前行业统一的接口设计规范替代了传统杂乱的接口请求方式让接口语义清晰、统一规范、易于维护。而CORS跨域问题是前后端联调的高频痛点90%的接口联调报错都源于跨域配置不当。本文将从零开始手把手带大家实现标准RESTful接口开发 全场景请求参数接收 生产级全局CORS配置摒弃零散代码提供可直接用于项目的完整方案同时解析底层原理和常见踩坑点。本文核心知识点清单RESTful API设计规范四大HTTP方法对应增删改查SpringBoot五种核心请求参数接收方式全覆盖业务场景三种生产级全局CORS跨域配置方案优先级对比、场景适配跨域核心原理、常见报错原因与终极解决方案生产环境CORS安全配置避坑指南二、RESTful API核心设计规范RESTfulRepresentational State Transfer即表述性状态转移核心思想是用HTTP请求方法定义操作用URL定义资源URL只命名资源不包含操作行为。2.1 传统接口 vs RESTful接口对比传统接口风格不规范/user/add 新增用户/user/delete 删除用户/user/update 修改用户/user/get 查询用户RESTful规范风格标准统一HTTP方法业务操作接口地址说明GET查询资源/api/user查询用户列表GET查询单资源/api/user/{id}根据ID查询单个用户POST新增资源/api/user新增用户PUT全量修改资源/api/user/{id}根据ID完整更新用户信息PATCH局部修改资源/api/user/{id}局部更新用户字段DELETE删除资源/api/user/{id}根据ID删除用户2.2 RESTful核心约束资源唯一URL定位唯一资源名词复数命名user、order、goods方法语义化严格遵循HTTP方法对应增删改查无状态服务器不存储客户端状态每次请求独立返回统一格式统一JSON响应体包含状态码、信息、数据三、SpringBoot全场景请求参数接收实战SpringBoot RESTful接口中参数接收分为5种核心场景覆盖所有业务开发需求下面结合RESTful接口逐一实战演示所有代码基于SpringBoot3可直接运行。前置基础RESTful接口统一控制器注解// 组合注解 Controller ResponseBody直接返回JSON数据RestControllerRequestMapping(/api/user)publicclassUserRestController{}3.1 PathVariable 路径参数URL路径传参适用场景查询单个资源、删除、修改RESTful标准传参参数拼接在URL路径中请求示例GET /api/user/1001/** * 根据ID查询单个用户 * param id 用户ID路径参数 * return 用户信息 */GetMapping(/{id})publicResultgetUserById(PathVariableLongid){returnResult.success(查询成功,用户IDid);}进阶用法多路径参数、参数别名、必填控制// 多路径参数 别名映射 非必填GetMapping(/{userId}/role/{roleId})publicResultgetUserRole(PathVariable(userId)Longuid,PathVariable(requiredfalse)LongroleId){returnResult.success(多参数查询成功,用户IDuid角色IDroleId);}3.2 RequestParam 查询参数URL问号传参适用场景列表查询、条件筛选、分页参数参数拼接在URL?后请求示例GET /api/user/list?name张三page1size10/** * 用户条件分页查询 * param name 用户名非必填 * param page 页码默认1 * param size 每页条数默认10 * return 分页数据 */GetMapping(/list)publicResultgetUserList(RequestParam(valuename,requiredfalse,defaultValue)Stringname,RequestParam(defaultValue1)Integerpage,RequestParam(defaultValue10)Integersize){StringresString.format(筛选用户%s页码%d条数%d,name,page,size);returnResult.success(分页查询成功,res);}核心参数说明value前端参数名与后端形参名不一致时做映射required是否必填默认truedefaultValue参数为空时默认值3.3 RequestBody JSON实体参数POST/PUT核心适用场景新增、修改接口前端传递JSON格式请求体最常用的传参方式注意GET请求不支持RequestBody仅POST/PUT/PATCH可用第一步创建实体接收类importlombok.Data;DatapublicclassUserDTO{// 用户名privateStringusername;// 手机号privateStringphone;// 年龄privateIntegerage;}第二步编写新增接口/** * 新增用户JSON请求体传参 * param userDTO 用户信息 * return 新增结果 */PostMappingpublicResultaddUser(RequestBodyUserDTOuserDTO){returnResult.success(新增用户成功,userDTO);}常见报错415 Unsupported Media Type原因前端未设置Content-Type: application/json3.4 RequestHeader 请求头参数适用场景获取Token、请求设备信息、自定义请求头等/** * 获取请求头中的Token * param token 登录令牌 * return 校验结果 */GetMapping(/token)publicResultgetToken(RequestHeader(Authorization)Stringtoken){returnResult.success(获取Token成功,令牌token);}3.5 普通表单参数无注解接收适用场景form表单提交Content-Type: application/x-www-form-urlencoded无需任何注解直接通过形参接收参数名与前端一致即可PostMapping(/form)publicResultformSubmit(Stringusername,Stringpassword){returnResult.success(表单提交成功,账号username密码password);}3.6 统一响应结果封装规范REST返回值为满足RESTful接口统一返回规范封装通用Result工具类所有接口统一返回格式importlombok.Data;DatapublicclassResultT{// 响应码200成功 500失败privateIntegercode;// 响应信息privateStringmsg;// 响应数据privateTdata;// 成功响应publicstaticTResultTsuccess(Stringmsg,Tdata){ResultTresultnewResult();result.setCode(200);result.setMsg(msg);result.setData(data);returnresult;}// 失败响应publicstaticTResultTerror(Stringmsg){ResultTresultnewResult();result.setCode(500);result.setMsg(msg);returnresult;}}四、CORS跨域原理与报错原因4.1 什么是跨域浏览器同源策略限制协议、域名、端口三者任意一个不同即为跨域浏览器会拦截响应抛出跨域报错。同源判定规则http://localhost:8080后端与 http://localhost:3000前端端口不同 跨域4.2 常见跨域报错Access to fetch at ‘xxx’ from origin ‘xxx’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.核心原因后端接口未配置跨域许可未返回对应的跨域响应头。五、三种生产级全局CORS配置方案推荐收藏SpringBoot中跨域配置分为局部注解配置和全局配置局部配置仅对单个接口生效企业项目统一使用全局配置下面提供三种主流全局配置方案适配不同场景。5.1 方案一实现WebMvcConfigurer最推荐、轻量化适用场景绝大多数SpringBoot项目不影响SpringSecurity、拦截器等配置优先级适中核心优势代码简洁、侵入性低、适配SpringBoot3importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.CorsRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;/** * 全局跨域配置方案一WebMvc配置 * 生产推荐精准配置域名禁止直接使用* */ConfigurationpublicclassCorsConfigimplementsWebMvcConfigurer{OverridepublicvoidaddCorsMappings(CorsRegistryregistry){// 匹配所有接口路径registry.addMapping(/**)// 允许跨域的前端域名生产环境替换为真实前端地址多个域名用逗号分隔.allowedOrigins(http://localhost:3000,http://127.0.0.1:3000)// 允许所有请求方法.allowedMethods(GET,POST,PUT,DELETE,OPTIONS)// 允许所有请求头.allowedHeaders(*)// 允许携带Cookie、Token凭证.allowCredentials(true)// 预检请求有效期1小时减少OPTIONS请求次数.maxAge(3600);}}5.2 方案二注册CorsFilter过滤器优先级最高、全局拦截适用场景需要优先执行跨域配置、整合SpringSecurity、高并发项目核心优势过滤器层级最高可解决拦截器、权限框架导致的跨域失效问题importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.cors.CorsConfiguration;importorg.springframework.web.cors.UrlBasedCorsConfigurationSource;importorg.springframework.web.filter.CorsFilter;importjava.util.Arrays;/** * 全局跨域配置方案二CorsFilter过滤器 * 优先级高于WebMvc配置适合整合权限框架的项目 */ConfigurationpublicclassCorsFilterConfig{BeanpublicCorsFiltercorsFilter(){CorsConfigurationconfignewCorsConfiguration();// 允许的前端域名config.setAllowedOrigins(Arrays.asList(http://localhost:3000,http://127.0.0.1:3000));// 允许请求方法config.setAllowedMethods(Arrays.asList(GET,POST,PUT,DELETE,OPTIONS));// 允许请求头config.setAllowedHeaders(Arrays.asList(*));// 允许携带凭证config.setAllowCredentials(true);// 预检请求缓存时间config.setMaxAge(3600L);// 匹配所有接口UrlBasedCorsConfigurationSourcesourcenewUrlBasedCorsConfigurationSource();source.registerCorsConfiguration(/**,config);returnnewCorsFilter(source);}}5.3 方案三yml配置文件极简配置快速开发适用场景本地开发、快速测试不推荐生产使用灵活性差在application.yml中直接添加配置# 全局跨域配置spring:web:cors:allowed-origins:http://localhost:3000allowed-methods:GET,POST,PUT,DELETE,OPTIONSallowed-headers:*allow-credentials:truemax-age:36005.4 局部跨域配置了解即可通过CrossOrigin注解作用于类或方法仅对当前接口生效RestControllerRequestMapping(/api/user)CrossOrigin(originshttp://localhost:3000)publicclassUserRestController{// 所有接口自动跨域}六、生产环境CORS核心避坑指南必看6.1 禁止使用 allowedOrigins(“*”)致命错误开启allowCredentials(true)时不能配置*通配符会直接报错原因浏览器安全机制允许携带Cookie时必须指定具体域名不允许全局开放生产方案枚举所有前端合法域名或通过配置文件动态读取6.2 OPTIONS预检请求403报错复杂请求带Token、自定义请求头会先发OPTIONS预检请求必须手动放行OPTIONS方法否则权限框架会拦截6.3 配置优先级规则CorsFilter过滤器 CrossOrigin注解 WebMvc全局配置 yml配置项目中只保留一种全局配置多配置共存会导致跨域失效、冲突报错6.4 跨域失效常见原因SpringSecurity未放行OPTIONS请求自定义拦截器在跨域过滤器之前执行配置类未加Configuration注解未生效前后端端口、域名匹配错误URL拼写格式错误配置前端跨域域名时禁止出现多余引号、空格、非法字符如 http://127.0.0.1:3000 错误格式URL末尾不能带双引号、逗号等冗余字符会直接导致跨域配置解析失败、前端请求跨域报错域名协议不匹配后端配置http协议前端使用https协议或反之引发跨域拦截SpringSecurity未放行OPTIONS请求自定义拦截器在跨域过滤器之前执行配置类未加Configuration注解未生效前后端端口、域名匹配错误七、完整项目测试流程启动SpringBoot项目端口8080使用Postman/Apifox测试所有RESTful接口启动前端项目3000端口调用后端接口跨域问题彻底解决所有参数接收场景均可正常解析返回统一JSON格式八、总结与下期预告本文总结掌握RESTful标准化接口设计告别杂乱接口风格吃透5种请求参数接收方式覆盖100%业务传参场景掌握3种生产级全局CORS配置解决所有跨域问题熟悉生产环境跨域避坑要点规避线上故障下期预告SpringBoot系列07全局异常处理统一返回结果封装彻底消灭接口杂乱报错 博主寄语RESTful接口开发和跨域配置是SpringBoot前后端分离的基础必修课看似简单但极易踩坑。建议大家收藏本文项目中直接复用配置规范代码风格提升开发效率。码字不易点赞关注持续更新SpringBoot干货有问题评论区交流秒回
RELATED

相关推荐

我终于搞定爬虫封IP!从零手写一套 Requests 自动轮换代理池(亲测可用)

我终于搞定爬虫封IP!从零手写一套 Requests 自动轮换代理池(亲测可用)

玩爬虫这么久,我踩过最多的坑,不是解析难、不是异步慢,而是 IP 被疯狂封禁。真的太烦了:本地IP跑一会儿就403、访问超时、直接拉黑,爬虫动不动就罢工,每次都得停手换网络。后面我干脆自己手写了一套轻量代理…

📅 2026/10/24 12:30:06
嵌入式键盘矩阵设计:2x2矩阵+74HC32实现高效输入

嵌入式键盘矩阵设计:2x2矩阵+74HC32实现高效输入

1. 项目背景与核心价值 在嵌入式系统开发中,输入设备的设计往往面临资源受限与功能需求的矛盾。传统独立按键方案需要占用大量GPIO引脚,而复杂编码器又带来成本飙升。2x2键盘矩阵配合74HC32或门芯片的方案,完美解决了这个痛点——仅需4个物理…

📅 2026/10/24 16:10:51
Trae:基于MCP协议的AI Agent工作流操作系统

Trae:基于MCP协议的AI Agent工作流操作系统

1. 项目概述:Trae不是另一个IDE,而是AI原生工作流的“操作系统级”接口“干货满满,带你在AI的道路上折腾 Trae”——这个标题里藏着一个被多数人忽略的关键动词:“折腾”。它不是“安装”“配置”“使用”,而是带着实验…

📅 2026/10/24 17:20:11
MORE NEWS

更多资讯

📰

视觉语音交互技术:多模态融合与场景化应用

1. 视觉语音交互的技术演进与行业现状 2007年iPhone的电容式触摸屏开启了触控交互的黄金十年,而今天我们正站在人机交互范式迁移的新拐点。在深度参与多个跨国企业的交互系统设计后,我观察到传统触控操作在车载、医疗、工业等场景已显现明显局限&#xf…

📰

text-to-cad 实战:Python 参数化建模与 STEP/URDF 导出全链路

1. 从一段文字到三维实体:text-to-cad 到底在解决什么问题 第一次听到 "text-to-cad" 这个词,很多人会下意识地把它理解成"用嘴画图"——说一句话,软件自动帮你把零件建出来。这个理解方向没错,但真正落地的时…

📰

深入理解Linux基础IO机制与性能调优

1. 为什么需要深入理解Linux基础IO? 在Linux系统管理中,IO(输入输出)操作是最基础也是最频繁的系统调用之一。我刚开始接触Linux服务器运维时,曾经遇到一个典型案例:某台运行着MySQL数据库的服务器突然性能…

📰

Linux TCP/UDP协议实战:socket参数与内核排错

做后端的人大概都遇到过这种场面:一个服务上线时跑得好好的,流量一上来延迟曲线就开始抽风,TCP连接数卡在某个数字上不去,或者UDP那边的收包速率怎么调都突破不了瓶颈。第一反应通常是加机器、换框架、调线程池,但排查…

📰

Python实现区块链时间胶囊:轻量级链上时间锚点方案

简介:本资源是一个基于Python与区块链技术实现的‘时间胶囊’开源项目,面向对分布式系统、智能合约开发及信息安全感兴趣的中高级开发者,旨在帮助学习者掌握如何利用区块链不可篡改特性构建可信时间戳服务。资源包共24个文件,含6个…

📰

降维与度量学习:高维数据处理的核心技术解析

1. 降维与度量学习:数据科学中的空间压缩艺术 当你的数据集拥有成百上千个特征维度时,就像试图在摩天大楼里寻找一颗特定的螺丝钉——传统算法会陷入维度灾难的泥沼。这就是为什么我们需要降维与度量学习这对黄金组合。我在金融风控和医疗影像领域处理过…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬