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

网站免费建站app长春网络公司做网站

网站免费建站app,长春网络公司做网站,360免费网站空间,美团这个网站多少钱做的前言 Controller层作为Spring Boot应用的门面#xff0c;直接负责与客户端交互#xff0c;其设计质量直接影响着整个应用的可用性、可维护性和扩展性。本文将系统性地介绍如何规划编写高质量的Controller层代码#xff0c;涵盖RESTful设计、参数处理、异常处理…前言 Controller层作为Spring Boot应用的门面直接负责与客户端交互其设计质量直接影响着整个应用的可用性、可维护性和扩展性。本文将系统性地介绍如何规划编写高质量的Controller层代码涵盖RESTful设计、参数处理、异常处理、日志记录、安全控制等关键方面并提供可落地的代码示例和架构建议。 一、Controller层基础架构规划 1.1 分层职责划分 在Spring Boot应用中典型的Controller层应保持瘦控制器原则主要职责包括 请求路由将HTTP请求映射到对应处理方法参数处理接收、校验和转换请求参数响应处理封装和返回统一格式的响应异常捕获处理业务异常和系统异常跨切面关注点日志、鉴权、限流等 1.2 包结构规划 推荐按功能模块划分包结构避免所有Controller堆放在同一包下 com.example.app ├── config/ # 配置类 ├── controller/ │ ├── v1/ # API版本控制 │ │ ├── UserController.java │ │ ├── ProductController.java │ ├── v2/ # 新版本API │ └── admin/ # 管理端接口 ├── service/ # 业务逻辑层 ├── repository/ # 数据访问层 └── model/ # 数据模型1.3 统一响应格式 定义标准响应体结构保持接口一致性 public class ApiResponseT {private int code;private String message;private T data;private long timestamp;// 成功响应public static T ApiResponseT success(T data) {return new ApiResponse(200, success, data);}// 失败响应public static T ApiResponseT fail(int code, String message) {return new ApiResponse(code, message, null);}// 构造方法、getter、setter省略 }二、RESTful API设计规范 2.1 资源命名与HTTP方法 资源GET(查询)POST(创建)PUT(更新)DELETE(删除)/users获取用户列表创建新用户批量更新用户批量删除用户/users/{id}获取指定用户详情-更新指定用户删除指定用户 2.2 版本控制策略 URL路径版本控制推荐 RestController RequestMapping(/api/v1/users) public class UserControllerV1 {// v1版本接口 }RestController RequestMapping(/api/v2/users) public class UserControllerV2 {// v2版本接口 }请求头版本控制 GetMapping(value /users, headers X-API-VERSION1) public ApiResponseListUser getUsersV1() { ... }GetMapping(value /users, headers X-API-VERSION2) public ApiResponseListUserDto getUsersV2() { ... }2.3 状态码规范 常用HTTP状态码 200 OK - 成功GET请求201 Created - 成功创建资源204 No Content - 成功无返回体400 Bad Request - 请求参数错误401 Unauthorized - 未认证403 Forbidden - 无权限404 Not Found - 资源不存在500 Internal Server Error - 服务器内部错误 三、请求参数处理最佳实践 3.1 参数接收方式选择 参数类型注解适用场景URL路径参数PathVariable/users/{id}URL查询参数RequestParam/users?namexxxage20请求体参数RequestBodyPOST/PUT JSON/XML格式数据请求头参数RequestHeader获取Authorization等头信息Cookie参数CookieValue获取特定Cookie值 3.2 参数校验方案 使用JSR-303校验规范配合Hibernate Validator PostMapping(/users) public ApiResponseUser createUser(Valid RequestBody UserCreateRequest request) {// 业务处理 }// 请求体定义 public class UserCreateRequest {NotBlank(message 用户名不能为空)Size(min 4, max 20, message 用户名长度4-20个字符)private String username;Email(message 邮箱格式不正确)private String email;Pattern(regexp ^(?.*[A-Za-z])(?.*\\d)[A-Za-z\\d]{8,}$, message 密码至少8位包含字母和数字)private String password;NotNull(message 年龄不能为空)Min(value 18, message 年龄必须大于18岁)private Integer age;// getter/setter }3.3 自定义参数解析 实现HandlerMethodArgumentResolver处理特殊参数 public class CurrentUserArgumentResolver implements HandlerMethodArgumentResolver {Overridepublic boolean supportsParameter(MethodParameter parameter) {return parameter.hasParameterAnnotation(CurrentUser.class);}Overridepublic Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {HttpServletRequest request (HttpServletRequest) webRequest.getNativeRequest();String token request.getHeader(Authorization);return authService.getUserByToken(token);} }// 注册解析器 Configuration public class WebMvcConfig implements WebMvcConfigurer {Overridepublic void addArgumentResolvers(ListHandlerMethodArgumentResolver resolvers) {resolvers.add(new CurrentUserArgumentResolver());} }// 使用示例 GetMapping(/profile) public ApiResponseUserProfile getProfile(CurrentUser User user) {return ApiResponse.success(userService.getProfile(user.getId())); }四、响应处理与异常处理 4.1 统一响应封装 使用ResponseBodyAdvice实现自动包装响应 RestControllerAdvice public class ResponseWrapper implements ResponseBodyAdviceObject {Overridepublic boolean supports(MethodParameter returnType, Class? extends HttpMessageConverter? converterType) {return !returnType.getParameterType().equals(ApiResponse.class);}Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType,MediaType selectedContentType,Class? extends HttpMessageConverter? selectedConverterType,ServerHttpRequest request, ServerHttpResponse response) {if (body instanceof String) {// 特殊处理String类型返回值return JsonUtils.toJson(ApiResponse.success(body));}return ApiResponse.success(body);} }4.2 全局异常处理 RestControllerAdvice public class GlobalExceptionHandler {private static final Logger logger LoggerFactory.getLogger(GlobalExceptionHandler.class);// 处理业务异常ExceptionHandler(BusinessException.class)public ApiResponseVoid handleBusinessException(BusinessException e) {logger.warn(业务异常: {}, e.getMessage());return ApiResponse.fail(e.getCode(), e.getMessage());}// 处理参数校验异常ExceptionHandler(MethodArgumentNotValidException.class)public ApiResponseVoid handleValidationException(MethodArgumentNotValidException e) {String message e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining(; ));return ApiResponse.fail(400, message);}// 处理系统异常ExceptionHandler(Exception.class)public ApiResponseVoid handleException(Exception e) {logger.error(系统异常, e);return ApiResponse.fail(500, 系统繁忙请稍后再试);} }4.3 响应结果处理 对于文件下载等特殊响应 GetMapping(/export) public ResponseEntityResource exportData(RequestParam String type) {String filename data. type;Resource resource exportService.exportData(type);return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, attachment; filename\ filename \).contentType(MediaType.APPLICATION_OCTET_STREAM).body(resource); }五、日志记录与性能监控 5.1 请求日志切面 Aspect Component Slf4j public class RequestLogAspect {Around(annotation(org.springframework.web.bind.annotation.RequestMapping))public Object logRequest(ProceedingJoinPoint joinPoint) throws Throwable {HttpServletRequest request ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();long startTime System.currentTimeMillis();Object result joinPoint.proceed();long elapsedTime System.currentTimeMillis() - startTime;log.info([{}] {} {} - {}ms (params: {}), request.getMethod(),request.getRequestURI(),request.getRemoteAddr(),elapsedTime,getParamsString(joinPoint.getArgs()));return result;}private String getParamsString(Object[] args) {return Arrays.stream(args).filter(arg - !(arg instanceof HttpServletRequest || arg instanceof HttpServletResponse)).map(Object::toString).collect(Collectors.joining(, ));} }5.2 慢请求监控 Aspect Component Slf4j public class SlowRequestAspect {Value(${app.slow-request-threshold:5000})private long threshold;Around(annotation(org.springframework.web.bind.annotation.RequestMapping))public Object monitorSlowRequest(ProceedingJoinPoint joinPoint) throws Throwable {long startTime System.currentTimeMillis();Object result joinPoint.proceed();long elapsedTime System.currentTimeMillis() - startTime;if (elapsedTime threshold) {MethodSignature signature (MethodSignature) joinPoint.getSignature();log.warn(慢接口警告: {} 执行时间: {}ms, signature.getMethod().getName(), elapsedTime);}return result;} }六、安全控制与权限管理 6.1 接口权限控制 基于Spring Security的权限控制 Configuration EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter {Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers(/api/public/**).permitAll().antMatchers(/api/admin/**).hasRole(ADMIN).antMatchers(/api/user/**).hasAnyRole(USER, ADMIN).anyRequest().authenticated().and().addFilter(new JwtAuthenticationFilter(authenticationManager())).addFilter(new JwtAuthorizationFilter(authenticationManager()));} }6.2 方法级权限注解 RestController RequestMapping(/api/admin/users) PreAuthorize(hasRole(ADMIN)) public class UserAdminController {DeleteMapping(/{id})PreAuthorize(hasAuthority(user:delete))public ApiResponseVoid deleteUser(PathVariable Long id) {userService.deleteUser(id);return ApiResponse.success();} }七、Controller层测试策略 7.1 单元测试示例 使用MockMvc测试Controller WebMvcTest(UserController.class) AutoConfigureMockMvc(addFilters false) // 禁用安全过滤器 public class UserControllerTest {Autowiredprivate MockMvc mockMvc;MockBeanprivate UserService userService;Testpublic void testGetUserById() throws Exception {User mockUser new User(1L, testUser, usertest.com);when(userService.getUserById(1L)).thenReturn(mockUser);mockMvc.perform(get(/api/v1/users/1).contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andExpect(jsonPath($.code).value(200)).andExpect(jsonPath($.data.username).value(testUser));} }7.2 集成测试示例 SpringBootTest(webEnvironment SpringBootTest.WebEnvironment.RANDOM_PORT) AutoConfigureTestDatabase public class UserControllerIntegrationTest {Autowiredprivate TestRestTemplate restTemplate;Testpublic void testCreateUser() {UserCreateRequest request new UserCreateRequest(newUser, newtest.com, password123, 25);ResponseEntityApiResponse response restTemplate.postForEntity(/api/v1/users, request, ApiResponse.class);assertEquals(HttpStatus.OK, response.getStatusCode());assertNotNull(response.getBody().getData());} }八、高级特性与性能优化 8.1 异步Controller 处理耗时请求时使用异步响应 RestController RequestMapping(/api/async) public class AsyncController {GetMapping(/data)public CallableApiResponseString getAsyncData() {return () - {Thread.sleep(3000); // 模拟耗时操作return ApiResponse.success(异步处理完成);};}GetMapping(/deferred)public DeferredResultApiResponseString getDeferredResult() {DeferredResultApiResponseString result new DeferredResult(5000L);CompletableFuture.runAsync(() - {try {Thread.sleep(3000);result.setResult(ApiResponse.success(延迟结果返回));} catch (InterruptedException e) {result.setErrorResult(ApiResponse.fail(500, 处理失败));}});return result;} }8.2 响应缓存控制 GetMapping(/cached) ResponseCache(duration 3600) // 自定义注解 public ApiResponseListProduct getProducts() {return ApiResponse.success(productService.getAllProducts()); }// 自定义缓存注解实现 Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface ResponseCache {int duration() default 60; // 缓存时间(秒) }九、Controller层设计原则总结 单一职责原则每个Controller只负责一个业务领域保持精简Controller应只包含路由和简单参数处理逻辑统一风格保持URL命名、参数传递和响应格式的一致性合理分层将业务逻辑下沉到Service层全面防御对所有输入参数进行校验明确文档使用Swagger等工具维护API文档性能意识考虑接口响应时间和并发能力安全第一对所有接口进行适当的安全控制 通过遵循以上原则和实践可以构建出结构清晰、易于维护、性能优良且安全可靠的Controller层为整个Spring Boot应用奠定坚实的基础架构。
http://www.hkea.cn/news/14533336/

相关文章:

  • 佛山企业网站建站做房地产开网
  • 长春企业自助建站南昌加盟网站制作
  • 网站界面设计需要首先做市场研究对吗网站建设公司应该怎么做推广
  • php玩具公司网站源码推广吧
  • 现在网站用什么软件做南京市的网站是由那几家公司做的
  • 网站建设大概好多钱厦门企业网站设计公司
  • 帝国cms网站名称做室内效果图网站
  • 医院网站云服务器配置python做网站的案例
  • 网站开发和运营维护公司部门组织架构图
  • 浙江广厦建设职业技术学院招生网站企网官方网站
  • 贵港网站推广中国新冠实际死了多少了
  • 贵州网站集约化建设wordpress什么插件好
  • 阿里云域名怎样做网站抖音怎么开通小程序推广
  • 怎么选择手机网站建设推荐几个网站
  • 网站建设后商品进不去详情页外国网站在中国做推广
  • 刷网站关网站模板种类
  • 网络营销网站建设方案大数据培训心得
  • 网站开发 荣誉资质ftp wordpress
  • 淘宝客网站建设视频哪里可以学酷家乐设计
  • 广州金将令做网站怎么样上海比较好的装修公司排名
  • 网站建设综合实训ppt模板企业网络推广方式
  • 网站建设公司推荐互赢网络企业系统软件排行
  • 室内装饰网站模板牧羊人wordpress主题
  • 大型门户网站建设哪专业wordpress 重定向多
  • 长江证券官方网站下载外贸网站建设注意事项
  • 进口跨境电商网站制作网站定制要求
  • 手机网站开发指南给网站做引流多少钱
  • 建设本地网站支付网站建设费
  • 网站规划总结哪个网站可以做淘宝代码
  • 学做网站论坛 可以吗北京兼职做网站建设