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

做网站学生作业接外包的平台

做网站学生作业,接外包的平台,广西钦州有做网站的公司吗,沈阳画册设计公司Spring WebFlux 与 WebClient 使用指南 目录 WebClient 概述核心依赖配置WebClient 的创建与配置发送 HTTP 请求 GET 请求POST 请求 错误处理 HTTP 错误处理 (onStatus)非 HTTP 错误处理 (doOnError) 同步与异步调用 subscribe() 与 block() 的区别 统一响应结构日志与监控高级…

Spring WebFlux 与 WebClient 使用指南


目录

  1. WebClient 概述
  2. 核心依赖配置
  3. WebClient 的创建与配置
  4. 发送 HTTP 请求
    • GET 请求
    • POST 请求
  5. 错误处理
    • HTTP 错误处理 (onStatus)
    • 非 HTTP 错误处理 (doOnError)
  6. 同步与异步调用
    • subscribe()block() 的区别
  7. 统一响应结构
  8. 日志与监控
  9. 高级配置
    • 超时与重试
    • 连接池管理
  10. 常见问题与最佳实践

1. WebClient 概述

WebClient 是 Spring WebFlux 模块提供的非阻塞、响应式 HTTP 客户端,基于 Project Reactor 实现,适用于高并发场景。
核心优势

  • 支持异步非阻塞 I/O,提升吞吐量。
  • 链式 API 设计,便于组合操作。
  • 集成 Spring 生态,支持自动编解码(JSON、XML)。

2. 核心依赖配置

pom.xml 中添加依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

3. WebClient 的创建与配置

3.1 全局配置(推荐)

@Configuration
public class WebClientConfig {@Beanpublic WebClient webClient() {return WebClient.builder().baseUrl("https://api.example.com") // 基础 URL.defaultHeader("Accept", "application/json").clientConnector(new ReactorClientHttpConnector(HttpClient.create().responseTimeout(Duration.ofSeconds(30)) // 响应超时).build();}
}

3.2 临时创建(按需使用)

WebClient client = WebClient.create("https://api.example.com");

4. 发送 HTTP 请求

4.1 GET 请求(携带 Token)

public Mono<User> getUser(String id, String token) {return webClient.get().uri("/users/{id}", id) // 路径参数.header("Token-Test", token) // 自定义 Token.retrieve().bodyToMono(User.class); // 解析为对象
}

4.2 POST 请求(发送数组 Body)

public Mono<String> postUsers(List<User> users, String token) {return webClient.post().uri("/users/batch").header("Token-Test", token).contentType(MediaType.APPLICATION_JSON).bodyValue(users) // 发送 List 集合.retrieve().bodyToMono(String.class);
}

5. 错误处理

5.1 HTTP 错误处理(onStatus

.onStatus(HttpStatus::isError, response ->response.bodyToMono(String.class).flatMap(errorBody -> {String msg = String.format("状态码: %d, 错误信息: %s", response.rawStatusCode(), errorBody);log.error(msg);return Mono.error(new ServiceException(msg));})
)

5.2 非 HTTP 错误处理(doOnError

.doOnError(error -> {if (!(error instanceof ServiceException)) {log.error("非 HTTP 错误: {}", error.getMessage());}
})

6. 同步与异步调用

6.1 异步调用(subscribe

webClient.get().uri("/data").retrieve().bodyToMono(String.class).subscribe(data -> log.info("成功: {}", data),error -> log.error("失败: {}", error));

6.2 同步调用(block,仅用于测试或特殊场景)

try {String result = webClient.get().uri("/data").retrieve().bodyToMono(String.class).block(Duration.ofSeconds(10)); // 阻塞等待
} catch (Exception e) {log.error("请求失败", e);
}

7. 统一响应结构

7.1 定义统一响应类

public class ApiResponse<T> {private int code;private String message;private T data;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);}
}

7.2 转换响应

public Mono<ApiResponse<User>> getUser(String id) {return webClient.get().uri("/users/{id}", id).retrieve().bodyToMono(User.class).map(ApiResponse::success) // 包装为成功响应.onErrorResume(e -> Mono.just(ApiResponse.error(500, e.getMessage())));
}

8. 日志与监控

8.1 成功日志

.doOnSuccess(response -> log.info("请求成功: {}", response)
)

8.2 错误日志

.doOnError(error -> log.error("请求失败: {}", error.getMessage())
)

9. 高级配置

9.1 超时与重试

.clientConnector(new ReactorClientHttpConnector(HttpClient.create().responseTimeout(Duration.ofSeconds(30)) // 响应超时
)
.retryWhen(Retry.backoff(3, Duration.ofSeconds(1))) // 指数退避重试

9.2 连接池配置

HttpClient.create().baseUrl("https://api.example.com").tcpConfiguration(tcpClient -> tcpClient.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000))

10. 常见问题与最佳实践

10.1 避免手动调用 subscribe

  • 错误示例
    // Service 层中手动调用 subscribe(不推荐)
    public void sendData() {webClient.post().subscribe(); // 可能导致资源泄漏
    }
    
  • 正确做法
    在 Controller 或调用方返回 Mono/Flux,由框架处理订阅。

10.2 统一异常处理

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(ServiceException.class)@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)public Mono<ApiResponse<?>> handleServiceException(ServiceException e) {return Mono.just(ApiResponse.error(500, e.getMessage()));}
}

10.3 性能优化

  • 复用 WebClient 实例:避免频繁创建新实例。
  • 合理设置超时:根据接口 SLA 调整响应和连接超时。

附录:完整代码示例

发送 POST 请求并处理错误

public Mono<ApiResponse<String>> syncData(List<User> users, String token) {String uri = UriComponentsBuilder.fromUriString("https://api.example.com").path("/batch").queryParam("source", "web").build().toUriString();return webClient.post().uri(uri).header("Token-Test", token).bodyValue(users).retrieve().onStatus(HttpStatus::isError, response -> response.bodyToMono(String.class).flatMap(errorBody -> Mono.error(new ServiceException("HTTP错误: " + errorBody)))).bodyToMono(String.class).map(ApiResponse::success).onErrorResume(e -> Mono.just(ApiResponse.error(500, e.getMessage())));
}

通过本文档,您可全面掌握 WebClient 的核心用法、错误处理策略及性能优化技巧。建议结合项目需求灵活调整配置,遵循响应式编程最佳实践。


文章转载自:

http://rdQoQSzk.dyzbt.cn
http://uWO2mw66.dyzbt.cn
http://6mVeQHgv.dyzbt.cn
http://e0FVtt34.dyzbt.cn
http://K22NsDon.dyzbt.cn
http://V3CPPFnM.dyzbt.cn
http://6PSyDOta.dyzbt.cn
http://E4GDRQ3E.dyzbt.cn
http://nhOIKbVG.dyzbt.cn
http://35137vtp.dyzbt.cn
http://muonfY1m.dyzbt.cn
http://ngYK16y1.dyzbt.cn
http://RlKzsYdf.dyzbt.cn
http://tpuMDJlq.dyzbt.cn
http://mMYl5oLP.dyzbt.cn
http://FfMNNKnH.dyzbt.cn
http://ftUop1UE.dyzbt.cn
http://vF1GsfXb.dyzbt.cn
http://A9G2gWDN.dyzbt.cn
http://ZyJcova9.dyzbt.cn
http://xnJC1LjZ.dyzbt.cn
http://MkB7FO1P.dyzbt.cn
http://zf4XUCJO.dyzbt.cn
http://d9Mq0VJi.dyzbt.cn
http://rmuQuCvK.dyzbt.cn
http://32JRdQcd.dyzbt.cn
http://lDTNF75a.dyzbt.cn
http://fu1vx13a.dyzbt.cn
http://LZtuhLo5.dyzbt.cn
http://lp3yhzft.dyzbt.cn
http://www.dtcms.com/wzjs/617943.html

相关文章:

  • 家居装修企业网站源码广州seo推广
  • 成都建站网站杭州网站建设培训班
  • 网站正在建设中 给你带来dw怎么做自我展示网站
  • 做网站彩票的代理好吗wordpress页面教程
  • php彩票网站建设教程怎么用dw做简单网站
  • 怎么做试玩平台推广网站企业宣传册模板科技
  • wordpress制作单页网站导航页面wordpress 商品站
  • 常州专业做网站家居企业网站建设渠道
  • 服务器怎么添加网站韶关网站开发
  • flash 网站建设软件定制网
  • 做网站用不用thinkphp云南房产网站建设
  • 做的好的办公家具网站seo咨询推广找推推蛙
  • 网站建设外包排名东莞比较好的设计公司
  • 网站建设课程有哪些收获中国排名第一的策划公司
  • 效果型网站建设安徽省建设监理网站
  • 基于html5的电商网站开发网站建设的简要任务执行书
  • 北京做养生SPA的网站建设制作企业宣传片拍摄公司
  • 自己的网站打不开了北京通网站建设
  • 郑州网站建设企业推荐怎么做电商运营
  • 上海网站开发定制wordpress标签分级
  • 网站编辑适不适合男生做wordpress 阌栾
  • 手机网站和电脑网站开发wordpress seo
  • 红安建设局官方网站河南小学网站建设
  • 临沂做网站wyjzgzs设计logo怎么设计
  • 企业为什么要建站点呢广州做网站公司电话
  • 商城网站大全做网站改版的
  • 沈阳市建设局网站首页嘉兴网络项目建站公司
  • 免费软件不收费网站WordPress相册插件pro
  • 网站建立策划书郑州设计logo公司
  • 6731官方网站下载it培训学校哪家好