上一篇
java怎么写外部接口
- 后端开发
- 2025-08-07
- 4
在Java中,常用Spring Boot框架写外部接口,先建Spring Boot项目,用
@RestController
标控制器类,
@RequestMapping
定路径,方法参数接收请求数据,返回对象
核心概念解析
术语 | 定义 | 典型应用场景 |
---|---|---|
RESTful API | 基于HTTP协议的资源风格架构 | Web服务、微服务通信 |
OpenAPI | 开放接口描述规范(原Swagger) | API文档标准化 |
DTO | Data Transfer Object | 前后端数据交互载体 |
Controller | MVC模式中的控制层 | 请求路由与业务逻辑调度 |
Service | 业务逻辑封装层 | 核心算法实现 |
Repository | 数据持久化操作层 | 数据库CRUD操作 |
技术栈选型建议
主流框架对比表
框架 | 特点 | 适用场景 |
---|---|---|
Spring Boot | 约定优于配置,快速启动,生态完善 | 企业级应用首选 |
Quarkus | 云原生优化,启动速度快,内存占用低 | 容器化/Serverless |
Micronaut | JVM热重载,低延迟 | 高性能要求场景 |
Vert.x | 多语言支持,异步非阻塞 | 高并发实时系统 |
推荐方案:采用Spring Boot + MyBatis Plus组合,兼顾开发效率与灵活性,配合Lombok减少样板代码,Hutool工具包增强功能。
接口设计规范
URL路径设计原则
- 复数名词:
/api/users
而非/api/user
- 版本隔离:
/v1/orders
>/orders
- 层级关系:
/departments/{deptId}/employees
- 动作语义:
| HTTP Method | 操作类型 | 示例路径 |
|————-|—————-|————————-|
| GET | 查询资源 |/products
|
| POST | 创建资源 |/products
|
| PUT | 更新资源 |/products/{id}
|
| DELETE | 删除资源 |/products/{id}
|
| PATCH | 局部修改 |/products/{id}
|
请求/响应规范
- 请求头:
Content-Type: application/json
- 响应结构:
public class ApiResponse<T> { private int code; // 业务状态码(非HTTP码) private String msg; // 提示信息 private T data; // 实际数据 private long timestamp;// 时间戳 }
- 错误码体系:建立分级错误码机制(系统级/业务级/第三方异常)
完整实现步骤
项目初始化
通过Spring Initializr创建项目,添加以下依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency>
实体类与DTO设计
@Data @TableName("tb_user") public class UserEntity { @TableId(type = IdType.AUTO) private Long id; @TableField("user_name") private String userName; // getter/setter自动生成 } @Data public class UserDTO { @NotBlank(message = "用户名不能为空") private String userName; @Email(message = "邮箱格式错误") private String email; }
控制器层实现
@RestController @RequestMapping("/api/users") @Validated // 启用参数校验 public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public ApiResponse<UserDTO> getUser(@PathVariable Long id) { UserEntity entity = userService.getById(id); return ApiResponse.success(convertToDTO(entity)); } @PostMapping public ApiResponse<Void> createUser(@Valid @RequestBody UserDTO dto) { userService.createUser(dto); return ApiResponse.success(); } private UserDTO convertToDTO(UserEntity entity) { // 使用MapStruct或手动转换 UserDTO dto = new UserDTO(); dto.setUserName(entity.getUserName()); return dto; } }
全局异常处理
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MethodArgumentNotValidException.class) public ApiResponse<String> handleValidationException(MethodArgumentNotValidException e) { String errorMsg = e.getBindingResult().getAllErrors().stream() .map(DefaultMessageSourceResolvable::getDefaultMessage) .collect(Collectors.joining(";")); return ApiResponse.fail(400, errorMsg); } }
Swagger文档配置
springfox: documentation: swagger-ui: enabled: true path: /swagger-ui.html paths: all # 扫描所有接口
关键优化点
性能优化策略
优化方向 | 实施方案 | 效果 |
---|---|---|
缓存机制 | Redis缓存热点数据 | QPS提升5-10倍 |
异步处理 | WebFlux响应式编程/CompletableFuture | 降低线程阻塞时间 |
SQL优化 | 索引优化+分页查询(PageHelper) | 复杂查询速度提升70% |
GZIP压缩 | 开启HTTP压缩 | 网络传输量减少60%+ |
安全防护措施
- 身份认证:JWT令牌+RBAC权限控制
- 防重放攻击:RequestHeader中的If-Match/If-None-Match
- 速率限制:令牌桶算法实现API限流
- 敏感数据处理:AES加密+脱敏展示(如手机号中间四位号)
测试验证方法
Postman测试要点
- 环境隔离:创建Dev/Test/Prod三个环境配置集
- 自动化脚本:编写Collection Runner进行回归测试
- 断言设置:同时验证HTTP状态码、响应体结构和业务数据
单元测试示例
@SpringBootTest @AutoConfigureMockMvc class UserControllerTest { @Autowired private MockMvc mockMvc; @Test void testCreateUser() throws Exception { mockMvc.perform(post("/api/users") .contentType(MediaType.APPLICATION_JSON) .content("{"userName":"test","email":"test@example.com"}")) .andExpect(status().isOk()) .andExpect(jsonPath("$.code").value(200)); } }
常见问题FAQs
Q1: 如何解决前端跨域请求问题?
A:在Spring Boot中可通过两种方式解决:
- 全局配置(推荐):在
WebMvcConfig
中添加:@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/") .allowedOrigins("") .allowedMethods("GET", "POST", "PUT", "DELETE") .allowCredentials(true); } }
- 注解方式:在特定控制器方法上添加
@CrossOrigin
注解,注意生产环境应限制允许的域名。
Q2: 如何统一处理接口返回格式?
A:通过ResponseBodyAdvice
接口实现全局拦截器:
@RestControllerAdvice public class GlobalResponseAdvice implements ResponseBodyAdvice<Object> { @Override public boolean supports(Class<? extends Object> clazz) { return true; // 对所有响应生效 } @Override public Object beforeBodyWrite(Object body, MethodParameter methodParam, MediaType mediaType, Class<? extends Object> clazz, ServerHttpRequest request, ServerHttpResponse response) { if (body instanceof String) { // 处理字符串响应 return ApiResponse.success(body); } else if (body instanceof ApiResponse) { // 已包装过的响应直接返回 return body; } else { // 普通对象包装为标准响应 return ApiResponse.success(body); }