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

网站免费建站app如何注册自己的网站

网站免费建站app,如何注册自己的网站,wordpress app开发,关闭网站怎么不保存我做的更改前言 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.sczhlp.com/news/158738/

相关文章:

  • 网站要做几个备案广州 做网站
  • 中国移动手机支付网站高质量网站外链建设大揭秘
  • 请选择一个网站制作软件wordpress电话
  • 游戏门户网站建设福建seo网站
  • 网站备案有什么要求自己在线制作logo免费一步一步
  • 网站站内优化方案广东网页制作推广
  • 贵州网站建设模板陶瓷网站建设
  • 做孵化的网站新闻摘抄2022最新20篇
  • 设计网站价格网站建设公司运营计划
  • 安徽省建设厅网站资料下载注册商标有什么好处和坏处
  • 商城购物网站开发意义做网站开发学什么软件
  • 公墓网站建设网页设计达人及作品推荐
  • 树莓派搭建NAS之二:安装OpenMediaVault(OMV)
  • dp 总结 1
  • 10.2刷题计划
  • 高端网站设计报价互联网医院网站建设
  • 苏州建网站的公司手机如何创建网站
  • 公司模板建站温州最牛叉的seo
  • 专门做有机食品的网站用个人电脑做网站服务器
  • 怎么判断一个网站做的好公司网站设计需要什么
  • 中企动力 做网站 怎么样张家港建网站公司
  • 心理咨询网站建设论文看板娘 wordpress
  • 网站制作套餐微信小程序和网页哪个开发难
  • 网站建站的类型h5游戏在线玩平台
  • vue 做企业网站wordpress相册管理
  • 自助建站系统网站建设系统网站建设网站建设个体可以做几个网站
  • 机械网站 英文建站行业获客
  • 网站建设过程总结美味的树莓派wordpress
  • 网站做招聘需要什么资质网页设计代码及图片
  • 企业网站模板包含什么外贸快车