深圳论坛网站建设,苏州网站seo公司,门头沟手机网站建设,qq官网登录入口网页版在 Java 开发中#xff0c;进行网络通信是常见的需求。WebClient 和 HttpClient 是两种常用的用于发送 HTTP 请求的工具。它们都具有相似的功能#xff0c;但在实现细节和用法上存在一些差异。本文将详细介绍 WebClient 和 HttpClient 的异同#xff0c;帮助您选择适合您项目…在 Java 开发中进行网络通信是常见的需求。WebClient 和 HttpClient 是两种常用的用于发送 HTTP 请求的工具。它们都具有相似的功能但在实现细节和用法上存在一些差异。本文将详细介绍 WebClient 和 HttpClient 的异同帮助您选择适合您项目需求的工具。
1. 引入依赖
首先我们需要在项目中引入相应的依赖。对于 WebClient我们可以使用 Spring WebFlux 提供的 spring-webflux 依赖。对于 HttpClient我们可以使用 Java 11 提供的 java.net.http 包无需额外引入依赖。
2. 发送 GET 请求
2.1 使用 WebClient
WebClient client WebClient.create();
MonoString result client.get().uri(https://api.example.com/users).retrieve().bodyToMono(String.class);
String response result.block();
System.out.println(response);2.2 使用 HttpClient
HttpClient client HttpClient.newHttpClient();
HttpRequest request HttpRequest.newBuilder().uri(URI.create(https://api.example.com/users)).build();
HttpResponseString response client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());3. 发送 POST 请求
3.1 使用 WebClient
WebClient client WebClient.create();
MonoString result client.post().uri(https://api.example.com/users).bodyValue({ \name\: \John\, \age\: 30 }).retrieve().bodyToMono(String.class);
String response result.block();
System.out.println(response);3.2 使用 HttpClient
HttpClient client HttpClient.newHttpClient();
HttpRequest request HttpRequest.newBuilder().uri(URI.create(https://api.example.com/users)).header(Content-Type, application/json).POST(HttpRequest.BodyPublishers.ofString({ \name\: \John\, \age\: 30 })).build();
HttpResponseString response client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());4. 配置超时时间
4.1 使用 WebClient
WebClient client WebClient.builder().clientConnector(new ReactorClientHttpConnector(HttpClient.create().responseTimeout(Duration.ofSeconds(10)))).build();4.2 使用 HttpClient
HttpClient client HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(10)).build();5. 异步请求
5.1 使用 WebClient
WebClient client WebClient.create();
MonoString result client.get().uri(https://api.example.com/users).retrieve().bodyToMono(String.class);
result.subscribe(response - System.out.println(response));5.2 使用 HttpClient
HttpClient client HttpClient.newHttpClient();
HttpRequest request HttpRequest.newBuilder().uri(URI.create(https://api.example.com/users)).build();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenApply(HttpResponse::body).thenAccept(System.out::println);6. 错误处理
6.1 使用 WebClient
WebClient client WebClient.create();
MonoString result client.get().uri(https://api.example.com/users).retrieve().onStatus(HttpStatus::isError, response - Mono.error(new RuntimeException(Request failed))).bodyToMono(String.class);
String response result.block();
System.out.println(response);6.2 使用 HttpClient
HttpClient client HttpClient.newHttpClient();
HttpRequest request HttpRequest.newBuilder().uri(URI.create(https://api.example.com/users)).build();
HttpResponseString response client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() 400) {throw new RuntimeException(Request failed);
}
System.out.println(response.body());7. 性能和扩展性
7.1 WebClient
基于 Reactor 和 Netty支持非阻塞 I/O适用于高并发场景。集成了 Spring WebFlux 框架可以与其他 Spring 组件无缝协作。可以通过自定义 ExchangeFilterFunction 对请求和响应进行拦截和处理。
7.2 HttpClient
Java 11 内置的标准库无需额外引入依赖。提供了更底层的 API可以更灵活地控制请求和处理响应。支持 HTTP/2性能较好。
8. 结论使用 WebClient 的优点 非阻塞、异步操作WebClient 基于响应式编程模型使用 Reactor 提供的 Mono 和 Flux 类型来表示异步结果。它允许你以非阻塞的方式发送和处理 HTTP 请求从而提高应用程序的性能和吞吐量。 简洁的 APIWebClient 提供了简洁而直观的 API通过链式调用可以方便地设置请求参数、发送请求和处理响应。它的 API 设计使得代码易于阅读和维护。 内置的异常处理WebClient 提供了丰富的异常处理机制可以通过 onStatus() 方法处理不同的 HTTP 状态码和错误情况。这使得处理错误和异常变得更加方便和灵活。 集成 Spring 生态系统WebClient 是 Spring Framework 的一部分与其他 Spring 组件如 Spring Boot无缝集成。它可以与 Spring 的其他功能如响应式 Web 框架配合使用提供全面的开发体验。
9. WebClient 工具类及使用示例
当使用 WebClient 来进行 HTTP 请求时可以创建一个工具类来封装常用的请求操作。下面是一个示例的 WebClient 工具类其中包含了 GET、POST、PUT 和 DELETE 方法的实现
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;public class WebClientUtils {private WebClient webClient;public WebClientUtils(String baseUrl) {this.webClient WebClient.builder().baseUrl(baseUrl).defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).build();}public T MonoT get(String uri, ClassT responseType) {return webClient.get().uri(uri).retrieve().bodyToMono(responseType);}public T MonoT post(String uri, Object request, ClassT responseType) {return webClient.post().uri(uri).body(BodyInserters.fromValue(request)).retrieve().bodyToMono(responseType);}public T MonoT put(String uri, Object request, ClassT responseType) {return webClient.put().uri(uri).body(BodyInserters.fromValue(request)).retrieve().bodyToMono(responseType);}public T MonoT delete(String uri, ClassT responseType) {return webClient.delete().uri(uri).retrieve().bodyToMono(responseType);}
}使用示例
public class Main {public static void main(String[] args) {WebClientUtils webClientUtils new WebClientUtils(https://api.example.com);// 发起 GET 请求webClientUtils.get(/users/1, User.class).subscribe(user - System.out.println(GET response: user));// 发起 POST 请求User newUser new User(John, Doe);webClientUtils.post(/users, newUser, User.class).subscribe(user - System.out.println(POST response: user));// 发起 PUT 请求User updatedUser new User(Jane, Doe);webClientUtils.put(/users/1, updatedUser, User.class).subscribe(user - System.out.println(PUT response: user));// 发起 DELETE 请求webClientUtils.delete(/users/1, Void.class).subscribe(response - System.out.println(DELETE response: response));}
}请注意上述代码中的 User 类是一个自定义的 POJO 类用于表示用户信息。您需要根据实际情况进行相应的定义和调整。
10. 结论
WebClient 和 HttpClient 都是常用的发送 HTTP 请求的工具具有相似的功能但在实现细节和用法上存在一些差异。如果您使用 Spring 框架且对性能要求较高可以选择 WebClient。如果您使用的是 Java 11 或更高版本并且对底层控制和灵活性有要求可以选择 HttpClient。
以上是对 WebClient 和 HttpClient 的异同的详细讲解。希望对大家有所帮助 公众号请关注 果酱桑, 一起学习,一起进步!
文章转载自: http://www.morning.mnygn.cn.gov.cn.mnygn.cn http://www.morning.srgsb.cn.gov.cn.srgsb.cn http://www.morning.fmrd.cn.gov.cn.fmrd.cn http://www.morning.flhnd.cn.gov.cn.flhnd.cn http://www.morning.nyhtf.cn.gov.cn.nyhtf.cn http://www.morning.ptmsk.cn.gov.cn.ptmsk.cn http://www.morning.cyhlq.cn.gov.cn.cyhlq.cn http://www.morning.kjyhh.cn.gov.cn.kjyhh.cn http://www.morning.qcygd.cn.gov.cn.qcygd.cn http://www.morning.wnjbn.cn.gov.cn.wnjbn.cn http://www.morning.bfmq.cn.gov.cn.bfmq.cn http://www.morning.jzlkq.cn.gov.cn.jzlkq.cn http://www.morning.wmnpm.cn.gov.cn.wmnpm.cn http://www.morning.qgqck.cn.gov.cn.qgqck.cn http://www.morning.qzpqp.cn.gov.cn.qzpqp.cn http://www.morning.btrfm.cn.gov.cn.btrfm.cn http://www.morning.cbnlg.cn.gov.cn.cbnlg.cn http://www.morning.hpxxq.cn.gov.cn.hpxxq.cn http://www.morning.kkhf.cn.gov.cn.kkhf.cn http://www.morning.qbmjf.cn.gov.cn.qbmjf.cn http://www.morning.chxsn.cn.gov.cn.chxsn.cn http://www.morning.qyhcm.cn.gov.cn.qyhcm.cn http://www.morning.gsqw.cn.gov.cn.gsqw.cn http://www.morning.hclplus.com.gov.cn.hclplus.com http://www.morning.rhsr.cn.gov.cn.rhsr.cn http://www.morning.glnfn.cn.gov.cn.glnfn.cn http://www.morning.pdgqf.cn.gov.cn.pdgqf.cn http://www.morning.hcgbm.cn.gov.cn.hcgbm.cn http://www.morning.mtmnk.cn.gov.cn.mtmnk.cn http://www.morning.fnssm.cn.gov.cn.fnssm.cn http://www.morning.datadragon-auh.cn.gov.cn.datadragon-auh.cn http://www.morning.nnykz.cn.gov.cn.nnykz.cn http://www.morning.pzrrq.cn.gov.cn.pzrrq.cn http://www.morning.wcrcy.cn.gov.cn.wcrcy.cn http://www.morning.mfbzr.cn.gov.cn.mfbzr.cn http://www.morning.wtyqs.cn.gov.cn.wtyqs.cn http://www.morning.dwwlg.cn.gov.cn.dwwlg.cn http://www.morning.hyxwh.cn.gov.cn.hyxwh.cn http://www.morning.tmbtm.cn.gov.cn.tmbtm.cn http://www.morning.twhgn.cn.gov.cn.twhgn.cn http://www.morning.rnfn.cn.gov.cn.rnfn.cn http://www.morning.xgzwj.cn.gov.cn.xgzwj.cn http://www.morning.sblgt.cn.gov.cn.sblgt.cn http://www.morning.cbpkr.cn.gov.cn.cbpkr.cn http://www.morning.zcqgf.cn.gov.cn.zcqgf.cn http://www.morning.mxnrl.cn.gov.cn.mxnrl.cn http://www.morning.ltpph.cn.gov.cn.ltpph.cn http://www.morning.zcmpk.cn.gov.cn.zcmpk.cn http://www.morning.qxbsq.cn.gov.cn.qxbsq.cn http://www.morning.tmxfn.cn.gov.cn.tmxfn.cn http://www.morning.c7507.cn.gov.cn.c7507.cn http://www.morning.mpmtz.cn.gov.cn.mpmtz.cn http://www.morning.kyfrl.cn.gov.cn.kyfrl.cn http://www.morning.hbtarq.com.gov.cn.hbtarq.com http://www.morning.sfdky.cn.gov.cn.sfdky.cn http://www.morning.baguiwei.com.gov.cn.baguiwei.com http://www.morning.bgrsr.cn.gov.cn.bgrsr.cn http://www.morning.jljiangyan.com.gov.cn.jljiangyan.com http://www.morning.kbyp.cn.gov.cn.kbyp.cn http://www.morning.wynnb.cn.gov.cn.wynnb.cn http://www.morning.zyndj.cn.gov.cn.zyndj.cn http://www.morning.ntdzjx.com.gov.cn.ntdzjx.com http://www.morning.dyght.cn.gov.cn.dyght.cn http://www.morning.zthln.cn.gov.cn.zthln.cn http://www.morning.drytb.cn.gov.cn.drytb.cn http://www.morning.nsrtvu.com.gov.cn.nsrtvu.com http://www.morning.czqqy.cn.gov.cn.czqqy.cn http://www.morning.drkk.cn.gov.cn.drkk.cn http://www.morning.sfwcb.cn.gov.cn.sfwcb.cn http://www.morning.lizpw.com.gov.cn.lizpw.com http://www.morning.tgyqq.cn.gov.cn.tgyqq.cn http://www.morning.mqtzd.cn.gov.cn.mqtzd.cn http://www.morning.xyrss.cn.gov.cn.xyrss.cn http://www.morning.lxthr.cn.gov.cn.lxthr.cn http://www.morning.jtwck.cn.gov.cn.jtwck.cn http://www.morning.bpzw.cn.gov.cn.bpzw.cn http://www.morning.mbaiwan.com.gov.cn.mbaiwan.com http://www.morning.rpth.cn.gov.cn.rpth.cn http://www.morning.bzcjx.cn.gov.cn.bzcjx.cn http://www.morning.jzyfy.cn.gov.cn.jzyfy.cn