常见的http状态码 + ResponseEntity
常见的http状态码
@ResponseStatus(HttpStatus.CREATED)
是 Spring Framework 中的注解,用于指定 HTTP 响应状态码。
1. 基本说明
HttpStatus.CREATED
对应 HTTP 状态码201
- 表示请求成功且创建了新的资源
- 通常用于 POST 请求的处理方法上
2. 使用场景和示例
基本使用
@RestController
@RequestMapping("/api/users")
public class UserController {@PostMapping@ResponseStatus(HttpStatus.CREATED) // 将返回 201 状态码public User createUser(@RequestBody User user) {return userService.createUser(user);}
}
带有详细响应的使用
@RestController
@RequestMapping("/api/products")
public class ProductController {@PostMapping@ResponseStatus(HttpStatus.CREATED)public ResponseEntity<Product> createProduct(@RequestBody Product product) {Product savedProduct = productService.save(product);// 创建资源的 URIURI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(savedProduct.getId()).toUri();// 返回 201 状态码和资源位置return ResponseEntity.created(location).body(savedProduct);}
}
3. 常用的 HTTP 状态码注解
// 成功相关
@ResponseStatus(HttpStatus.OK) // 200 - 请求成功,返回资源或结果
@ResponseStatus(HttpStatus.CREATED) // 201 - 资源创建成功
@ResponseStatus(HttpStatus.NO_CONTENT) // 204 - 成功但无返回内容// 客户端错误
@ResponseStatus(HttpStatus.BAD_REQUEST) // 400 - 请求格式错误,客户端请求无效
@ResponseStatus(HttpStatus.UNAUTHORIZED) // 401 - 未授权,需身份验证
@ResponseStatus(HttpStatus.FORBIDDEN) // 403 - 禁止访问
@ResponseStatus(HttpStatus.NOT_FOUND) // 404 - 资源未找到
@ResponseStatus(HttpStatus.CONFLICT) // 409 - 资源冲突// 服务器错误
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) // 500 - 服务器内部错误
如果需要更灵活地设置响应内容(如返回自定义的响应体或头部信息),可以使用 ResponseEntity,而不是 @ResponseStatus
@ResponseStatus
是一种简洁的方式,用于指定固定的 HTTP 状态码,但它的功能相对有限。如果需要更灵活地设置响应内容(如自定义响应体、响应头、动态状态码等),可以使用 ResponseEntity
。
1. 为什么选择 ResponseEntity
?
ResponseEntity
是 Spring 提供的一个强大的工具,用于构建 HTTP 响应。它允许你:
- 动态设置 HTTP 状态码
- 自定义响应头
- 返回复杂的响应体
- 更灵活地处理不同的场景
2. ResponseEntity
的基本用法
示例 1: 返回自定义状态码和响应体
@PostMapping("/users")
public ResponseEntity<String> createUser(@RequestBody UserRequest userRequest) {userService.createUser(userRequest);return ResponseEntity.status(HttpStatus.CREATED).body("User created successfully");
}
ResponseEntity.status(HttpStatus.CREATED)
:设置 HTTP 状态码为201 Created
。.body("User created successfully")
:设置响应体为自定义的字符串。
示例 2: 返回带有响应头的信息
@PostMapping("/users")
public ResponseEntity<String> createUser(@RequestBody UserRequest userRequest) {userService.createUser(userRequest);// 设置自定义响应头HttpHeaders headers = new HttpHeaders();headers.add("Custom-Header", "CustomHeaderValue");return ResponseEntity.status(HttpStatus.CREATED).headers(headers).body("User created successfully");
}
HttpHeaders
:用于设置响应头。.headers(headers)
:将自定义的响应头添加到响应中。
示例 3: 返回带有资源位置的响应
在 RESTful API 中,创建资源后通常会返回 Location
头,指向新创建资源的 URI。
@PostMapping("/users")
public ResponseEntity<Void> createUser(@RequestBody UserRequest userRequest) {Long userId = userService.createUser(userRequest);// 构造资源的 URIURI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(userId).toUri();// 返回 201 Created 和 Location 头return ResponseEntity.created(location).build();
}
ServletUriComponentsBuilder
:用于动态构建资源的 URI。.created(location)
:设置状态码为201 Created
,并添加Location
头。
示例 4: 动态返回不同的状态码
@PostMapping("/users")
public ResponseEntity<String> createUser(@RequestBody UserRequest userRequest) {if (userService.isDuplicate(userRequest)) {return ResponseEntity.status(HttpStatus.CONFLICT).body("User already exists");}userService.createUser(userRequest);return ResponseEntity.status(HttpStatus.CREATED).body("User created successfully");
}
- 如果用户已存在,返回
409 Conflict
。 - 如果创建成功,返回
201 Created
。
3. 与 @ResponseStatus
的对比
特性 | @ResponseStatus | ResponseEntity |
---|---|---|
设置状态码 | 固定状态码,不能动态设置 | 可以动态设置状态码 |
自定义响应体 | 不支持 | 支持返回任意类型的响应体 |
自定义响应头 | 不支持 | 支持通过 HttpHeaders 设置响应头 |
适用场景 | 简单场景,状态码固定 | 复杂场景,需要动态响应 |
代码简洁性 | 更简洁 | 代码稍显冗长 |
4. 综合示例:结合异常处理
自定义异常类
@ResponseStatus(HttpStatus.NOT_FOUND) // 默认返回 404
public class UserNotFoundException extends RuntimeException {public UserNotFoundException(String message) {super(message);}
}
使用 ResponseEntity
处理异常
@RestController
@RequestMapping("/users")
public class UserController {@GetMapping("/{id}")public ResponseEntity<User> getUser(@PathVariable Long id) {User user = userService.findById(id).orElseThrow(() -> new UserNotFoundException("User not found with id: " + id));return ResponseEntity.ok(user); // 返回 200 和用户信息}@ExceptionHandler(UserNotFoundException.class)public ResponseEntity<ErrorResponse> handleUserNotFound(UserNotFoundException ex) {ErrorResponse errorResponse = new ErrorResponse("USER_NOT_FOUND", ex.getMessage());return ResponseEntity.status(HttpStatus.NOT_FOUND).body(errorResponse);}
}
@ExceptionHandler
:捕获异常并返回自定义的响应。ErrorResponse
:自定义的错误响应体。
5. 总结
@ResponseStatus
:适合简单场景,状态码固定,代码简洁。ResponseEntity
:适合复杂场景,允许动态设置状态码、响应头和响应体。
如果你的需求需要动态响应内容(如返回资源位置、错误信息、或自定义头部信息),ResponseEntity
是更灵活的选择。通过使用 ResponseEntity
,我们可以更精确地控制 HTTP 响应的各个方面,使 API 更加灵活和专业。这对于构建复杂的 RESTful API 特别有用,因为它允许我们根据不同的业务场景返回不同的响应。
@RestController/
@ResponseBody + ResponseEntity
使用 @RestController
或 @ResponseBody
返回对象时,Spring 会自动将返回的对象序列化为 JSON 并写入响应体,@RestController
或 @ResponseBody
返回的对象会自动设置状态码为 200 OK
。 缺点:无法直接设置响应头或动态状态码。使用 @RestController 或 @ResponseBody 返回对象 如果需要返回特定的 HTTP 状态码,可以结合 ResponseEntity 使用。
使用 @RestController
或 @ResponseBody
直接返回对象时的主要缺点是无法直接设置响应头或动态状态码。以下是这些限制的详细说明和解决方案:
1. 基本限制示例
@RestController
@RequestMapping("/api/users")
public class UserController {// 直接返回对象的方式@GetMapping("/{id}")@ResponseBodypublic User getUser(@PathVariable Long id) {return userService.findById(id); // 只能返回 200 OK}// 无法直接设置响应头@PostMapping@ResponseBodypublic User createUser(@RequestBody User user) {return userService.save(user); // 应该返回 201 Created,但只能是 200 OK}
}
2. 主要限制
-
状态码限制:
- 默认总是返回 200 OK
- 无法动态设置状态码
- 无法返回创建成功(201)等特定状态码
-
响应头限制:
- 无法添加自定义响应头
- 无法设置 Content-Disposition 等特殊头部
- 无法控制缓存相关头部
-
错误处理限制:
- 无法直接返回错误状态码
- 需要依赖全局异常处理
3. 解决方案
方案一:使用 ResponseEntity
@RestController
@RequestMapping("/api/users")
public class UserController {// 使用 ResponseEntity 返回特定状态码@PostMappingpublic ResponseEntity<User> createUser(@RequestBody User user) {User savedUser = userService.save(user);return ResponseEntity.status(HttpStatus.CREATED).body(savedUser);}// 设置自定义响应头@GetMapping("/{id}")public ResponseEntity<User> getUser(@PathVariable Long id) {return userService.findById(id).map(user -> ResponseEntity.ok().header("X-Custom-Header", "value").body(user)).orElse(ResponseEntity.notFound().build());}
}
方案二:使用 HttpServletResponse
@RestController
@RequestMapping("/api/users")
public class UserController {// 注入 HttpServletResponse@PostMapping("/manual")@ResponseBodypublic User createUserManual(@RequestBody User user,HttpServletResponse response) {User savedUser = userService.save(user);response.setStatus(HttpServletResponse.SC_CREATED);response.setHeader("X-Custom-Header", "value");return savedUser;}
}
方案三:使用统一响应包装类
// 统一响应包装类
public class ApiResponse<T> {private int code;private String message;private T data;private Map<String, String> headers = new HashMap<>();// 构造方法和静态工厂方法public static <T> ApiResponse<T> success(T data) {return new ApiResponse<>(200, "Success", data);}public static <T> ApiResponse<T> created(T data) {return new ApiResponse<>(201, "Created", data);}
}// 使用响应包装类的控制器
@RestController
@RequestMapping("/api/users")
public class UserController {@PostMappingpublic ApiResponse<User> createUser(@RequestBody User user) {User savedUser = userService.save(user);return ApiResponse.created(savedUser);}
}// 响应拦截器
@Component
public class ApiResponseInterceptor implements ResponseBodyAdvice<ApiResponse<?>> {@Overridepublic boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {return ApiResponse.class.isAssignableFrom(returnType.getParameterType());}@Overridepublic ApiResponse<?> beforeBodyWrite(ApiResponse<?> body, MethodParameter returnType,MediaType selectedContentType,Class<? extends HttpMessageConverter<?>> selectedConverterType,ServerHttpRequest request,ServerHttpResponse response) {if (body != null) {response.setStatusCode(HttpStatus.valueOf(body.getCode()));body.getHeaders().forEach((key, value) -> response.getHeaders().add(key, value));}return body;}
}
方案四:使用 AOP 拦截
@Aspect
@Component
public class ResponseHeaderAspect {@Around("@annotation(responseHeaders)")public Object addResponseHeaders(ProceedingJoinPoint joinPoint, ResponseHeaders responseHeaders) throws Throwable {Object result = joinPoint.proceed();HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getResponse();if (response != null) {for (Header header : responseHeaders.value()) {response.setHeader(header.name(), header.value());}}return result;}
}// 自定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ResponseHeaders {Header[] value();
}@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Header {String name();String value();
}// 使用示例
@RestController
@RequestMapping("/api/users")
public class UserController {@PostMapping@ResponseHeaders({@Header(name = "X-Custom-Header", value = "value"),@Header(name = "X-Created-By", value = "system")})public User createUser(@RequestBody User user) {return userService.save(user);}
}
方案五:使用过滤器
@Component
public class ResponseModifierFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {HttpServletResponse httpResponse = (HttpServletResponse) response;ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(httpResponse);chain.doFilter(request, responseWrapper);// 修改响应if (isUserCreationEndpoint(request)) {responseWrapper.setStatus(HttpServletResponse.SC_CREATED);responseWrapper.setHeader("X-Custom-Header", "value");}responseWrapper.copyBodyToResponse();}
}
特性 | @RestController / @ResponseBody | ResponseEntity | HttpServletResponse |
---|---|---|---|
默认状态码 | 固定为 200 OK | 可动态设置 | 可动态设置 |
自定义响应头 | 不支持 | 支持 | 支持 |
动态状态码 | 不支持 | 支持 | 支持 |
代码复杂性 | 简单 | 中等 | 较高 |
推荐场景 | 简单的 RESTful API | 需要动态状态码或自定义头部的场景 | 特殊场景(如文件流、低级操作) |
详细解释如何使用 @RestController
或 @ResponseBody
结合 ResponseEntity
来返回对象和特定的 HTTP 状态码。
1. 基本用法
@RestController
@RequestMapping("/api/users")
public class UserController {@PostMappingpublic ResponseEntity<User> createUser(@RequestBody User user) {User savedUser = userService.save(user);return ResponseEntity.status(HttpStatus.CREATED).body(savedUser);}@GetMapping("/{id}")public ResponseEntity<User> getUser(@PathVariable Long id) {return userService.findById(id).map(ResponseEntity::ok) // 返回 200 OK.orElse(ResponseEntity.notFound().build()); // 返回 404 Not Found}
}
2. 统一响应格式
// 统一响应格式
public class ApiResponse<T> {private int code; // 状态码private String message; // 消息private T data; // 数据private LocalDateTime timestamp = LocalDateTime.now(); // 时间戳// 成功静态方法public static <T> ApiResponse<T> success(T data) {return new ApiResponse<>(200, "Success", data);}// 错误静态方法public static <T> ApiResponse<T> error(int code, String message) {return new ApiResponse<>(code, message, null);}// 构造方法、getter和setter
}
3. CRUD 操作示例
@RestController
@RequestMapping("/api/users")
public class UserController {private final UserService userService;// 构造注入public UserController(UserService userService) {this.userService = userService;}// 创建用户@PostMappingpublic ResponseEntity<ApiResponse<User>> createUser(@RequestBody @Valid User user) {User savedUser = userService.save(user);return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(savedUser));}// 获取用户@GetMapping("/{id}")public ResponseEntity<ApiResponse<User>> getUser(@PathVariable Long id) {return userService.findById(id).map(user -> ResponseEntity.ok(ApiResponse.success(user))).orElse(ResponseEntity.status(HttpStatus.NOT_FOUND).body(ApiResponse.error(404, "User not found")));}// 更新用户@PutMapping("/{id}")public ResponseEntity<ApiResponse<User>> updateUser(@PathVariable Long id, @RequestBody @Valid User user) {return userService.findById(id).map(existingUser -> {User updatedUser = userService.update(id, user);return ResponseEntity.ok(ApiResponse.success(updatedUser));}).orElse(ResponseEntity.status(HttpStatus.NOT_FOUND).body(ApiResponse.error(404, "User not found")));}// 删除用户@DeleteMapping("/{id}")public ResponseEntity<ApiResponse<Void>> deleteUser(@PathVariable Long id) {if (userService.existsById(id)) {userService.deleteById(id);return ResponseEntity.ok(ApiResponse.success(null));}return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ApiResponse.error(404, "User not found"));}// 获取用户列表(分页)@GetMappingpublic ResponseEntity<ApiResponse<Page<User>>> getUsers(@RequestParam(defaultValue = "0") int page,@RequestParam(defaultValue = "10") int size) {Page<User> users = userService.findAll(PageRequest.of(page, size));return ResponseEntity.ok(ApiResponse.success(users));}
}
4. 异常处理
@RestControllerAdvice
public class GlobalExceptionHandler {// 处理验证错误@ExceptionHandler(MethodArgumentNotValidException.class)public ResponseEntity<ApiResponse<Map<String, String>>> handleValidationErrors(MethodArgumentNotValidException ex) {Map<String, String> errors = new HashMap<>();ex.getBindingResult().getFieldErrors().forEach(error -> errors.put(error.getField(), error.getDefaultMessage()));return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.error(400, "Validation failed", errors));}// 处理业务逻辑异常@ExceptionHandler(BusinessException.class)public ResponseEntity<ApiResponse<Void>> handleBusinessException(BusinessException ex) {return ResponseEntity.status(ex.getStatus()).body(ApiResponse.error(ex.getStatus().value(), ex.getMessage()));}// 处理其他未知异常@ExceptionHandler(Exception.class)public ResponseEntity<ApiResponse<Void>> handleUnknownException(Exception ex) {return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ApiResponse.error(500, "Internal server error"));}
}
5. 自定义业务异常
public class BusinessException extends RuntimeException {private final HttpStatus status;public BusinessException(String message, HttpStatus status) {super(message);this.status = status;}public HttpStatus getStatus() {return status;}
}
6. 带条件的响应示例
@RestController
@RequestMapping("/api/orders")
public class OrderController {// 创建订单@PostMappingpublic ResponseEntity<ApiResponse<Order>> createOrder(@RequestBody @Valid OrderRequest request) {// 检查库存if (!inventoryService.checkStock(request)) {return ResponseEntity.status(HttpStatus.CONFLICT).body(ApiResponse.error(409, "Insufficient stock"));}// 检查用户信用if (!userService.checkCredit(request.getUserId())) {return ResponseEntity.status(HttpStatus.PAYMENT_REQUIRED).body(ApiResponse.error(402, "Insufficient credit"));}// 创建订单Order order = orderService.createOrder(request);// 如果是加急订单,添加特殊响应头if (request.isUrgent()) {return ResponseEntity.status(HttpStatus.CREATED).header("X-Priority", "High").body(ApiResponse.success(order));}return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(order));}
}
7. 文件上传响应示例
@RestController
@RequestMapping("/api/files")
public class FileController {@PostMapping("/upload")public ResponseEntity<ApiResponse<FileInfo>> uploadFile(@RequestParam("file") MultipartFile file) {try {FileInfo savedFile = fileService.store(file);return ResponseEntity.status(HttpStatus.CREATED).header("Location", "/api/files/" + savedFile.getId()).body(ApiResponse.success(savedFile));} catch (IOException e) {return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ApiResponse.error(500, "Failed to upload file"));}}@GetMapping("/download/{id}")public ResponseEntity<Resource> downloadFile(@PathVariable String id) {Resource file = fileService.loadAsResource(id);return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getFilename() + "\"").body(file);}
}
8. 返回流式数据
如果需要返回流式数据(如文件下载),可以结合 ResponseEntity
和 InputStreamResource
。
示例:返回文件下载
@RestController
@RequestMapping("/files")
public class FileController { @GetMapping("/download/{filename}") public ResponseEntity<InputStreamResource> downloadFile(@PathVariable String filename) throws IOException { File file = fileService.getFile(filename); InputStreamResource resource = new InputStreamResource(new FileInputStream(file)); return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + file.getName()) .contentLength(file.length()) .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(resource); }
}
-
响应:
-
状态码:
200 OK
-
响应头:
Content-Disposition: attachment; filename=myfile.txt
-
响应体:文件内容
-
9. 使用建议
-
统一响应格式:
- 使用统一的响应封装类(如
ApiResponse
) - 包含必要的状态码、消息和数据字段
- 添加时间戳便于调试和日志追踪
- 使用统一的响应封装类(如
-
适当的状态码:
- 200: 成功获取资源
- 201: 成功创建资源
- 204: 成功处理但无返回内容
- 400: 请求参数错误
- 401: 未认证
- 403: 无权限
- 404: 资源不存在
- 409: 资源冲突
- 500: 服务器错误
-
异常处理:
- 使用全局异常处理器统一处理异常
- 区分业务异常和系统异常
- 提供清晰的错误信息
-
响应头设置:
- 根据需要设置自定义响应头
- 文件操作时设置适当的 Content-Type 和 Content-Disposition
-
验证处理:
- 使用
@Valid
注解进行请求验证 - 提供详细的验证错误信息
- 使用
通过这种方式,可以构建出统一、规范的 API 响应,便于客户端处理和调试。
10. 最佳实践建议
- 优先使用
@RestController
或@ResponseBody
:- 如果不需要动态设置状态码或响应头,直接返回对象即可,简单高效。
- 使用
ResponseEntity
解决局限性:- 当需要动态设置状态码或自定义响应头时,推荐使用
ResponseEntity
,它是 Spring 提供的标准解决方案,代码优雅且易于维护。
- 当需要动态设置状态码或自定义响应头时,推荐使用
- 仅在特殊场景下使用
HttpServletResponse
:- 如果需要直接操作底层响应流(如文件下载、流式数据),可以使用
HttpServletResponse
。
- 如果需要直接操作底层响应流(如文件下载、流式数据),可以使用
-
优先使用 ResponseEntity:
- 最清晰和直接的解决方案
- 提供完整的响应控制
- 类型安全且易于维护
-
统一响应格式:
- 定义统一的响应包装类
- 使用响应拦截器统一处理
- 便于维护和扩展
-
分层处理:
- 控制器层:业务逻辑和基本响应
- 拦截器层:通用响应头和状态码
- 过滤器层:全局响应修改
-
异常处理:
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ResponseEntity<ApiResponse<String>> handleException(Exception ex) {ApiResponse<String> response = ApiResponse.error(500, "Internal Server Error",ex.getMessage());return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);}
}
- 文档和注释:
/*** 用户控制器* 注意:直接返回对象时无法设置状态码和响应头* 建议使用 ResponseEntity 或其他替代方案*/
@RestController
@RequestMapping("/api/users")
public class UserController {// 控制器方法...
}
通过以上方案,可以克服 @RestController
和 @ResponseBody
的限制,实现更灵活的响应控制。选择合适的方案取决于具体需求和项目架构。
相关文章:
常见的http状态码 + ResponseEntity
常见的http状态码 ResponseStatus(HttpStatus.CREATED) 是 Spring Framework 中的注解,用于指定 HTTP 响应状态码。 1. 基本说明 HttpStatus.CREATED 对应 HTTP 状态码 201表示请求成功且创建了新的资源通常用于 POST 请求的处理方法上 2. 使用场景和示例 基本…...

pikachu - Cross-Site Scripting(XSS)
pikachu - Cross-Site Scripting(XSS) 声明! 笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人无关,切勿触碰法律底线,否则后果自负&#x…...
操作系统之文件系统的基本概念
目录 用户和磁盘视角的文件 文件控制块(FCB)和索引结点(inode) 文件的操作 创建文件(create系统调用) 写文件(write系统调用) 读文件(read系统调用) 重…...

深入探讨 Android 中的 AlarmManager:定时任务调度及优化实践
引言 在 Android 开发中,AlarmManager 是一个非常重要的系统服务,用于设置定时任务或者周期性任务。无论是设置一个闹钟,还是定时进行数据同步,AlarmManager 都是不可或缺的工具之一。然而,随着 Android 系统的不断演…...

西电-算法分析-研究生课程复习笔记
24年秋的应该是张老师最后一次用卷面考试,他说以后这节课的期末考试都是在OJ上刷题了张老师上课还挺有意思的,上完之后能学会独立地思考算法设计问题了。整节课都在强调规模压缩这个概念,考试也是考个人对这些的理解,还挺好玩的哈…...

编译时找不到需要的库,如何在PyCharm中为你的项目添加需要的库
丰富的库支持是 Python 语言的一大特点,但是在使用 PyCharm 进行Python 代码编译的时候,遇到一些需要使用到的库提示不能解析时,该如何添加呢? 比如下图所示的代码,可以看到需要使用 selenium、b4、jieba 这些库&…...

ip addr 命令给Linux网络接口配置多个IP地址值
问一下Chatgpt 怎么使用ip addr 命令给Linux网络接口配置多个IP地址值 根据Chatgpt的提示执行了命令,命令执行成功,看下执行结果。 ifconfig 命令查看接口IP地址 ip addr show 命令查看接口IP地址...
C#语言的数据库编程
C#语言的数据库编程 在现代软件开发中,数据库是不可或缺的一部分。无论是企业级应用还是个人项目,数据的存储与管理都是程序的核心功能之一。C#作为一种强类型、面向对象的编程语言,广泛应用于Windows平台的开发,尤其是在构建与数…...

时频分析之S变换
S变换的提出 1996年,由R.G Stockwell 提出了S变换,和其他时频分析工具一样,通过S变换,我们可以同时从时域以及频域观察一个信号的能量分布。S变换融合了短时傅里叶变换和小波变换的优点。关于S变换,最早发表于TSP上的…...

第二十八周学习周报
目录 摘要Abstract1 GFPGAN1.1 总体结构1.2 实验研究1.3 代码分析 总结 摘要 本周主要的学习内容是GFPGAN模型。GFPGAN是一种基于生成对抗网络(GAN)的模型,其利用封装在预训练的人脸GAN中的丰富多样的先验进行人脸图像的修复。这种生成面部先验(GFP&…...
SurfaceFlinger MessageQueue原理
SurfaceFlinger MessageQueue 有2个作用: 处理SurfaceFlinger INVALIDATE、REFRESH事件管理SurfaceFlinger主线程挂起和恢复 SurfaceFlinger::run() { while (true) { mEventQueue->waitMessage(); } } waitMessage {do {IPCThreadState::self()->flushComm…...
component-动态控制 div width 的值 根据传入的变量决定width的值 vue
1.实现 根据参数的值,div显示不同的长度 <div class"node-line" :style"lineProgress"></div> <script>export default {name: "trainSummaryInfo",data(){return{linePercentage:200,}},computed:{lineProgress…...

C#中的常用集合
目录 一、动态数组ArrayList 二、List 三、栈(Stack) 四、队列(Queue) 五、字典(Dictionary),int> 一、动态数组ArrayList ArrayList 是 C# 中提供的一种动态数组类,位于命名空间 Syste…...

插入实体自增主键太长,mybatis-plaus自增主键
1、问题 spring-boot整合mybtais执行insert语句时,主键id为长文本数据。 2、分析问题 1)数据库主键是否自增 2)数据库主键的种子值设置的多少 3、解决问题 1)数据库主键设置的时自增 3)种子值是1 所以排查是数据库的问题 4、继…...

晨辉面试抽签和评分管理系统之一:考生信息管理和编排
晨辉面试抽签和评分管理系统(下载地址:www.chenhuisoft.cn)是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…...

【MySQL】MVCC详解, 图文并茂简单易懂
欢迎来到啊妮莫的学习小屋 祝读本文的朋友都天天开心呀 目录 MVCC简介快照读与当前读快照读当前读 隔离级别隐藏字段和Undo Log版本链✨MVCC原理--ReadView✨ReadView简介设计思路适用隔离级别重要内容 ReadView规则MVCC整体流程 不同隔离级别下的MVCC读已提交可重复读 总结 M…...
中国数字化发展的问题与机会
橙蜂智能公司致力于提供先进的人工智能和物联网解决方案,帮助企业优化运营并实现技术潜能。公司主要服务包括AI数字人、AI翻译、埃域知识库、大模型服务等。其核心价值观为创新、客户至上、质量、合作和可持续发展。 橙蜂智农的智慧农业产品涵盖了多方面的功能,如智能化推荐、…...

【ROS2】☆ launch之Python
☆重点 ROS1和ROS2其中一个很大区别之一就是launch的编写方式。在ROS1中采用xml格式编写launch,而ROS2保留了XML 格式launch,还另外引入了Python和YAML 编写方式。选择哪种编写取决于每位开发人员的爱好,但是ROS2官方推荐使用Python方式编写…...

如何稳定使用 O1 / O1 Pro,让“降智”现象不再困扰?
近期,不少朋友在使用 O1 或 O1 Pro 模型时,都会碰到“降智”或“忽高忽低”的智力波动,比如无法识图、无法生成图片、甚至回答准确度也不稳定。面对这些问题,你是不是也感到头疼呢? 为了找到更可靠的解决办法…...
zookeeper监听机制(Watcher机制)
文章目录 引言I zookeeper监听机制Watcher机制实现分布式的通知功能触发事件种类Watcher的三个过程II watch机制特点一次性触发事件封装event异步发送先注册再触发常见的通知状态和事件类型III 应用案例(Kafka)Kafka的消息模型Kafka在Zookeeper中保存的元数据Kafka 基于Contr…...

LeetCode--23.合并k个升序链表
解题思路: 1.获取信息: 给出了多个升序链表,要求合并成一个升序链表,返回首元结点 2.分析题目: 外面在21题的时候,讲了怎样合并两个升序链表为一个升序链表,不了解的,建议去看一下21…...

Python爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

SpringBoot手动实现流式输出方案整理以及SSE规范输出详解
背景: 最近做流式输出时,一直使用python实现的,应需求方的要求,需要通过java应用做一次封装并在java侧完成系统鉴权、模型鉴权等功能后才能真正去调用智能体应用,基于此调研java实现流式输出的几种方式,并…...
【Go语言基础【7】】条件语句
文章目录 零、概述一、if 条件语句1. 单条件模型2. 多条件模型(else if)3. 条件嵌套与优化 二、switch 条件判断1. 基本用法2. fallthrough 穿透执行3. break 终止执行 零、概述 语句类型适用场景核心特点if-else单条件或简单多条件判断逻辑清晰&#x…...
双电机差速控制的MATLAB Simulink仿真方案,使用PWM和PID调节实现360°转向与速度控制_可复现,有问题请联系博主
以下是一个双电机差速控制的MATLAB Simulink仿真方案,使用PWM和PID调节实现360转向与速度控制。方案包含系统建模、控制策略和仿真实现。 系统模型 差速运动学模型: 线速度 ( v = \frac{v_r + v_l}{2} )角速度 ( \omega = \frac{v_r - v_l}{d} )其中 ( v_r, v_l ) 为右/左轮线…...

自托管图书搜索引擎Bookologia
简介 什么是 Bookologia ? Bookologia 是一个专门的书籍搜索引擎,可以在几秒钟内找到任何书籍。它是开源的,可以轻松自托管在 Docker 上,为用户提供一个简单而高效的书籍查找体验。 主要特点 简洁的用户界面:界面设计…...

三种读写传统xls格式文件开源库libxls、xlslib、BasicExcel的比较
最近准备读写传统xls格式文件,而不是较新的xlsx,询问DeepSeek有哪些开源库,他给出了如下的简介和建议,还给出了相应链接,不过有的链接已失效。最后还不忘提醒,现在该用xlsx格式了。 以下是几个可以处理传统…...
Spring Boot缓存组件Ehcache、Caffeine、Redis、Hazelcast
一、Spring Boot缓存架构核心 Spring Boot通过spring-boot-starter-cache提供统一的缓存抽象层: #mermaid-svg-PW9nciqD2RyVrZcZ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-PW9nciqD2RyVrZcZ .erro…...

day34- 系统编程之 网络编程(TCP)
一、补充 ip地址:除了本机地址如:192.168.0.151还可以使用(自己测试)本地回环地址(127.0.0.1)或者使用htonl(INADDR_ANY); 二、模式 C/S 模式 ->服务器/客户端模型:TCP传输控制协议 2.1 …...
每日算法刷题Day23 6.5:leetcode二分答案3道题,用时1h40min(有点慢)
8. 3007.价值和小于等于K的最大数字(中等,学习,太难,先过) 3007. 价值和小于等于 K 的最大数字 - 力扣(LeetCode) 思想 1.给你一个整数 k 和一个整数 x 。整数 num 的价值是它的二进制表示中在 x,2x,3x …...