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

网站建设温州科目一布吉做棋牌网站建设

网站建设温州科目一,布吉做棋牌网站建设,网站建设中图片怎么样,品牌关键词排名优化怎么做更多SpringBoot3内容请关注我的专栏#xff1a;《SpringBoot3》 期待您的点赞#x1f44d;收藏⭐评论✍ 重学SpringBoot3-WebClient配置与使用详解 1. 简介2. 环境准备2.1 依赖配置 3. WebClient配置3.1 基础配置3.2 高级配置3.3 retrieve()和exchange()区别 4. 使用示例4.1 … 更多SpringBoot3内容请关注我的专栏《SpringBoot3》 期待您的点赞收藏⭐评论✍ 重学SpringBoot3-WebClient配置与使用详解 1. 简介2. 环境准备2.1 依赖配置 3. WebClient配置3.1 基础配置3.2 高级配置3.3 retrieve()和exchange()区别 4. 使用示例4.1 基本请求操作4.2 处理复杂响应4.3 高级用法 5. 最佳实践6. 注意事项7. 与RestTemplate对比8. 总结参考资料 1. 简介 WebClient是Spring 5引入的响应式Web客户端用于执行HTTP请求。相比传统的RestTemplateWebClient提供了非阻塞、响应式的方式来处理HTTP请求是Spring推荐的新一代HTTP客户端工具。本文将详细介绍如何在SpringBoot 3.x中配置和使用WebClient。 2. 环境准备 2.1 依赖配置 在 pom.xml中添加必要的依赖 parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion3.2.10/versionrelativePath/ !-- lookup parent from repository --/parentdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-webflux/artifactId/dependency3. WebClient配置 3.1 基础配置 Configuration public class WebClientConfig {Beanpublic WebClient webClient() {return WebClient.builder().baseUrl(https://echo.apifox.com).defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE).build();} }3.2 高级配置 package com.coderjia.boot3webflux.config;import io.netty.channel.ChannelOption; import io.netty.handler.timeout.ReadTimeoutHandler; import io.netty.handler.timeout.WriteTimeoutHandler; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.client.reactive.ReactorClientHttpConnector; import org.springframework.web.reactive.function.client.ExchangeFilterFunction; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; import reactor.netty.http.client.HttpClient; import reactor.netty.resources.ConnectionProvider;import java.time.Duration;/*** author CoderJia* create 2024/12/3 下午 09:42* Description**/ Slf4j Configuration public class WebClientConfig {Beanpublic WebClient webClient() {// 配置HTTP连接池ConnectionProvider provider ConnectionProvider.builder(custom).maxConnections(500).maxIdleTime(Duration.ofSeconds(20)).build();// 配置HTTP客户端HttpClient httpClient HttpClient.create(provider).option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000).responseTimeout(Duration.ofSeconds(5)).doOnConnected(conn -conn.addHandlerLast(new ReadTimeoutHandler(5)).addHandlerLast(new WriteTimeoutHandler(5)));// 构建WebClient实例return WebClient.builder().clientConnector(new ReactorClientHttpConnector(httpClient)).baseUrl(https://echo.apifox.com).defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)// 添加请求日志记录功能.filter(ExchangeFilterFunction.ofRequestProcessor(clientRequest - {log.debug(Request: {} {},clientRequest.method(),clientRequest.url());return Mono.just(clientRequest);}))// 添加响应日志记录功能.filter(ExchangeFilterFunction.ofResponseProcessor(clientResponse - {log.debug(Response status: {},clientResponse.statusCode());return Mono.just(clientResponse);})).build();} }3.3 retrieve()和exchange()区别 在使用 WebClient 进行 HTTP 请求时retrieve() 和 exchange() 方法都可以用来处理响应但它们有不同的用途和行为。以下是它们的主要区别 retrieve() 用途retrieve() 方法用于简化响应处理特别是当你只需要响应体时。自动错误处理retrieve() 会自动处理 HTTP 错误状态码例如 4xx 和 5xx并抛出 WebClientResponseException 及其子类。返回值通常用于直接获取响应体例如 bodyToMono(String.class) 或 bodyToFlux(String.class)。适用场景适用于大多数常见的请求处理场景特别是当你不需要手动处理响应状态码时。 exchange() 用途exchange() 方法提供了更底层的控制允许你手动处理响应包括响应状态码和响应头。手动错误处理exchange() 不会自动处理 HTTP 错误状态码你需要手动检查响应状态码并进行相应的处理。返回值返回 ClientResponse 对象你可以从中提取响应状态码、响应头和响应体。适用场景适用于需要手动处理响应状态码或响应头的复杂场景。 示例对比 retrieve() public MonoJSONObject get(String q1) {return webClient.get().uri(uriBuilder - uriBuilder.path(/get).queryParam(q1, q1).build()).accept(MediaType.APPLICATION_JSON).retrieve().bodyToMono(JSONObject.class); }exchange() public MonoJSONObject get(String q1) {return webClient.get().uri(uriBuilder - uriBuilder.path(/get).queryParam(q1, q1).build()).accept(MediaType.APPLICATION_JSON).exchangeToMono(response - {if (response.statusCode().is2xxSuccessful()) {return response.bodyToMono(JSONObject.class);} else {return Mono.error(new RuntimeException(Request failed with status code: response.statusCode()));}}); }4. 使用示例 4.1 基本请求操作 package com.coderjia.boot3webflux.service;import com.alibaba.fastjson.JSONObject; import jakarta.annotation.Resource; import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono;/*** author CoderJia* create 2024/12/3 下午 10:22* Description**/ Service public class ApiService {Resourceprivate WebClient webClient;// GET请求public MonoJSONObject get(String q1) {return webClient.get().uri(uriBuilder - uriBuilder.path(/get).queryParam(q1, q1).build()).accept(MediaType.APPLICATION_JSON).retrieve().bodyToMono(JSONObject.class);}// POST请求public MonoJSONObject post(JSONObject body) {return webClient.post().uri(/post).bodyValue(body).retrieve().bodyToMono(JSONObject.class);}// PUT请求public MonoJSONObject put(String q1, JSONObject JSONObject) {return webClient.put().uri(uriBuilder - uriBuilder.path(/put).queryParam(q1, q1).build()).bodyValue(JSONObject).retrieve().bodyToMono(JSONObject.class);}// DELETE请求public MonoJSONObject delete(String q1) {return webClient.delete().uri(uriBuilder - uriBuilder.path(/delete).queryParam(q1, q1).build()).retrieve().bodyToMono(JSONObject.class);} }效果展示 4.2 处理复杂响应 Service public class ApiService {// 获取列表数据public FluxJSONObject getAllUsers() {return webClient.get().uri(/users).retrieve().bodyToFlux(JSONObject.class);}// 处理错误响应public MonoJSONObject getUserWithErrorHandling(Long id) {return webClient.get().uri(/users/{id}, id).retrieve().onStatus(HttpStatusCode::is4xxClientError, clientResponse - Mono.error(new RuntimeException(客户端错误))).onStatus(HttpStatusCode::is5xxServerError, clientResponse - Mono.error(new RuntimeException(服务器错误))).bodyToMono(JSONObject.class);}// 使用exchange()方法获取完整响应public MonoResponseEntityJSONObject getUserWithFullResponse(Long id) {return webClient.get().uri(/users/{id}, id).accept(MediaType.APPLICATION_JSON).exchange().flatMap(response - response.toEntity(JSONObject.class));} }4.3 高级用法 Service public class ApiService {// 带请求头的请求public MonoJSONObject getUserWithHeaders(Long id, String token) {return webClient.get().uri(/users/{id}, id).header(Authorization, Bearer token).retrieve().bodyToMono(JSONObject.class);}// 带查询参数的请求public FluxJSONObject searchUsers(String name, int age) {return webClient.get().uri(uriBuilder - uriBuilder.path(/users/search).queryParam(name, name).queryParam(age, age).build()).retrieve().bodyToFlux(JSONObject.class);}// 文件上传public MonoString uploadFile(FilePart filePart) {return webClient.post().uri(/upload).contentType(MediaType.MULTIPART_FORM_DATA).body(BodyInserters.fromMultipartData(file, filePart)).retrieve().bodyToMono(String.class);} }5. 最佳实践 合理使用响应式类型 使用 Mono 用于单个对象使用 Flux 用于集合数据注意背压处理 错误处理 public MonoJSONObject getUserWithRetry(Long id) {return webClient.get().uri(/users/{id}, id).retrieve().bodyToMono(JSONObject.class).retryWhen(Retry.backoff(3, Duration.ofSeconds(1))).timeout(Duration.ofSeconds(5)).onErrorResume(TimeoutException.class,e - Mono.error(new RuntimeException(请求超时)));}资源管理 使用连接池设置适当的超时时间实现优雅关闭 6. 注意事项 WebClient 是非阻塞的需要注意响应式编程的特性合理配置连接池和超时参数在生产环境中实现适当的错误处理和重试机制注意内存使用特别是处理大量数据时 7. 与RestTemplate对比 特性WebClientRestTemplate编程模型响应式、非阻塞同步、阻塞性能更好一般资源利用更高效一般学习曲线较陡平缓适用场景高并发、响应式系统简单应用、传统系统 8. 总结 WebClient 作为 Spring 推荐的新一代 HTTP 客户端提供了强大的响应式编程能力和更好的性能。虽然相比 RestTemplate 有一定的学习曲线但在现代微服务架构中其带来的好处远超过学习成本。建议在新项目中优先考虑使用WebClient特别是在需要处理高并发请求的场景下。 参考资料 Spring WebClient官方文档Spring Boot官方文档Project Reactor文档
http://www.w-s-a.com/news/78181/

相关文章:

  • 湖南网站推广优化cc域名做门户网站
  • 网站开发大概多久怎么制做网站
  • 鄂州官方网站食品网站建设需求分析
  • 福州网站建设金森要做好网络营销首先要
  • 中山哪里有好网站建设公司企业培训考试平台下载
  • 域名备案查询 网站备案查询企业网站建设问题研究
  • wordpress无法编辑北京优化网站方法
  • 公司建设一个网站最好的网站建设哪家好
  • 南京市住宅建设总公司网站wordpress 自己写的网页
  • 淄博网站制作企业高端长沙企业网站制作服务报价
  • 网站服务理念中外商贸网站建设
  • 如何自己建立网站中国建设银行网站忘记密码
  • 什么是a站如何在12366网站上做实名认证
  • 斗蟋蟀网站建设谭谭心怎么建设网站
  • 优秀网站开发商郑州网站建设套餐
  • 做伤残鉴约号网站购物网站建设新闻
  • 黄江网站建设公司自己房子做民宿挂什么网站
  • 手游网站做cpc还是cpm广告号宣武郑州阳网站建设
  • vs连接数据库做网站建立网站
  • 电商网站设计图片素材p2p网站建设石家庄
  • 莲塘网站建设如何文字推广一个婚恋网站
  • 医院网站建设工作汇报WordPress不发邮件了
  • 怎么做外语网站个人网页设计作品ps
  • 网站原型怎么做vps如何建两个网站
  • 商城网站建设源码嘉兴seo计费管理
  • 城乡建设网站证件查询系统wordpress 时间代码
  • php网站建设 关键技术做网站哪家正规
  • 网站开发用什么写得比较好谷歌的英文网站
  • 青岛网站建设公司在哪vivo手机商城
  • 兼职刷客在哪个网站做哪个网站做淘宝客