Java HTTP 请求的四种实现方式:Apache HttpClient、OkHttp、WebClient 与 Java 11 HttpClient

06-01 1902阅读

目录

1.使用Java11+内置的`HttpClient`

2.使用OkHttp

3.使用SpringWebClient

4.使用ApacheHttpClient5.x


在现代Java开发中,`HttpClient`和`PostMethod`是较旧的ApacheHttpClient3.x的API。推荐使用更现代的技术来替代这些代码,例如Java11+内置的`HttpClient`或第三方库如OkHttp或SpringWebClient。

以下是使用这些技术的替代方案:

1.使用Java11+内置的`HttpClient`

Java11引入了新的`HttpClient`API,支持同步和异步请求,功能强大且易于使用。

java代码:
importjava.net.URI;
importjava.net.http.HttpClient;
importjava.net.http.HttpRequest;
importjava.net.http.HttpResponse;
publicclassHttpClientExample{
  publicstaticvoidmain(String[]args)throwsException{
    Stringurl="https://example.com/api";
    //创建HttpClient实例
    HttpClienthttpClient=HttpClient.newHttpClient();
    //创建POST请求
    HttpRequestrequest=HttpRequest.newBuilder()
        .uri(URI.create(url))
        .header("Content-Type","application/json")//设置请求头
        .POST(HttpRequest.BodyPublishers.ofString("{\"key\":\"value\"}"))//设置请求体
        .build();
    //发送请求并获取响应
    HttpResponseresponse=httpClient.send(request,HttpResponse.BodyHandlers.ofString());
    //获取响应状态码和响应体
    intstatusCode=response.statusCode();
    StringresponseBody=response.body();
    System.out.println("StatusCode:"+statusCode);
    System.out.println("ResponseBody:"+responseBody);
  }
}

优点:

-内置在JDK11+中,无需额外依赖。

-支持同步和异步请求。

-代码简洁易读。

2.使用OkHttp

OkHttp是一个广泛使用的第三方HTTP客户端库,功能强大且性能优异。

添加依赖(Maven):

  com.squareup.okhttp3
  okhttp
  4.12.0

示例代码:

Java HTTP 请求的四种实现方式:Apache HttpClient、OkHttp、WebClient 与 Java 11 HttpClient
(图片来源网络,侵删)
importokhttp3.*;
importjava.io.IOException;
publicclassOkHttpExample{
  publicstaticvoidmain(String[]args){
    Stringurl="https://example.com/api";
    //创建OkHttpClient实例
    OkHttpClientclient=newOkHttpClient();
    //创建请求体
    MediaTypemediaType=MediaType.parse("application/json");
    RequestBodybody=RequestBody.create("{\"key\":\"value\"}",mediaType);
    //创建POST请求
    Requestrequest=newRequest.Builder()
        .url(url)
        .post(body)
        .build();
    //发送请求并获取响应
    try(Responseresponse=client.newCall(request).execute()){
      intstatusCode=response.code();
      StringresponseBody=response.body().string();
      System.out.println("StatusCode:"+statusCode);
      System.out.println("ResponseBody:"+responseBody);
    }catch(IOExceptione){
      e.printStackTrace();
    }
  }
}

 优点:

-功能丰富,支持连接池、缓存、拦截器等。

Java HTTP 请求的四种实现方式:Apache HttpClient、OkHttp、WebClient 与 Java 11 HttpClient
(图片来源网络,侵删)

-性能优异。

-易于集成到现有项目中。

Java HTTP 请求的四种实现方式:Apache HttpClient、OkHttp、WebClient 与 Java 11 HttpClient
(图片来源网络,侵删)

3.使用SpringWebClient

如果您使用的是Spring框架(特别是SpringWebFlux),可以使用`WebClient`来发送HTTP请求。`WebClient`是Spring5引入的非阻塞HTTP客户端。

添加依赖(Maven):

  org.springframework.boot
  spring-boot-starter-webflux

示例代码:

importorg.springframework.web.reactive.function.client.WebClient;
importreactor.core.publisher.Mono;
publicclassWebClientExample{
  publicstaticvoidmain(String[]args){
    Stringurl="https://example.com/api";
    //创建WebClient实例
    WebClientwebClient=WebClient.create();
    //发送POST请求
    Monoresponse=webClient.post()
        .uri(url)
        .header("Content-Type","application/json")
        .bodyValue("{\"key\":\"value\"}")
        .retrieve()
        .bodyToMono(String.class);
    //获取响应
    response.subscribe(body->{
      System.out.println("ResponseBody:"+body);
    });
  }
}

优点:

-非阻塞、响应式编程模型。

-与Spring生态无缝集成。

-支持流式处理。

4.使用ApacheHttpClient5.x

如果您仍然希望使用ApacheHttpClient,可以升级到最新的5.x版本。

添加依赖(Maven):

  org.apache.httpcomponents.client5
  httpclient5
  5.2.1

示例代码:

importorg.apache.hc.client5.http.classic.methods.HttpPost;
importorg.apache.hc.client5.http.classic.methods.HttpUriRequestBase;
importorg.apache.hc.client5.http.impl.classic.CloseableHttpClient;
importorg.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
importorg.apache.hc.client5.http.impl.classic.HttpClients;
importorg.apache.hc.core5.http.io.entity.EntityUtils;
importorg.apache.hc.core5.http.io.entity.StringEntity;
publicclassHttpClient5Example{
  publicstaticvoidmain(String[]args)throwsException{
    Stringurl="https://example.com/api";
    //创建HttpClient实例
    try(CloseableHttpClienthttpClient=HttpClients.createDefault()){
      //创建POST请求
      HttpPosthttpPost=newHttpPost(url);
      httpPost.setHeader("Content-Type","application/json");
      httpPost.setEntity(newStringEntity("{\"key\":\"value\"}"));
      //发送请求并获取响应
      try(CloseableHttpResponseresponse=httpClient.execute(httpPost)){
        intstatusCode=response.getCode();
        StringresponseBody=EntityUtils.toString(response.getEntity());
        System.out.println("StatusCode:"+statusCode);
        System.out.println("ResponseBody:"+responseBody);
      }
    }
  }
}

优点:

-功能强大,支持高级特性。

-适合需要复杂HTTP操作的场景。

总结

技术适用场景优点
Java 11+ HttpClient无需额外依赖,JDK 内置简洁、现代,支持同步和异步
OkHttp高性能、功能丰富易于使用,支持连接池、缓存等
Spring WebClientSpring 项目,响应式编程非阻塞,与 Spring 生态集成
Apache HttpClient 5需要复杂 HTTP 操作功能强大,适合高级场景

根据您的项目需求选择合适的技术。如果项目已经使用Spring,推荐使用`WebClient`;如果需要高性能和简洁性,推荐使用OkHttp或Java11+的`HttpClient`。

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码