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

news/2025/2/27 5:30:59

目录

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">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();

    //发送请求并获取响应
    HttpResponse<String>response=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):

<dependency>
  <groupId>com.squareup.okhttp3</groupId>
  <artifactId>okhttp</artifactId>
  <version>4.12.0</version>
</dependency>

示例代码:

java">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();
    }
  }
}

 优点:
-功能丰富,支持连接池、缓存、拦截器等。
-性能优异。
-易于集成到现有项目中。

3.使用SpringWebClient

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

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

示例代码:

java">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请求
    Mono<String>response=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):

<dependency>
  <groupId>org.apache.httpcomponents.client5</groupId>
  <artifactId>httpclient5</artifactId>
  <version>5.2.1</version>
</dependency>

示例代码:

java">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`。


http://www.niftyadmin.cn/n/5869519.html

相关文章

ubuntu配置jmeter

1.前提准备 系统 ubuntu server 22.04 前提条件&#xff1a;服务器更新apt与安装lrzsz&#xff1a;更新apt&#xff1a; sudo apt update安装lrzsz: 命令行下的上传下载文件工具 sudo apt install lrzszsudo apt install zip2.安装jemeter 2.1.下载jdk17 输入命令&#xf…

网络渗透作业

第一题&#xff1a;使用Xpath对Order by 语句进行布尔盲注 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml&quo…

游戏引擎学习第125天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾并为今天的内容做准备。 昨天&#xff0c;当我们离开时&#xff0c;工作队列已经完成了基本的功能。这个队列虽然简单&#xff0c;但它能够执行任务&#xff0c;并且我们已经为各种操作编写了测试。字符串也能够正常推送到队…

初会学习记录

【25初级会计《实务》】第一章&#xff1a;权责发生制举例_哔哩哔哩_bilibili 务实&#xff1a; 第一章 (1)会计概念&#xff0c;职能和目标&#xff1a; 2025年2月25日&#xff1a; (2)会计假设&#xff1a; 2025年2月26日&#xff1a; (3)会计核算基础&#xff1a; 202…

centos和ubuntu安装mysql教程

1&#xff0c;安装包准备 cd /usr/local/ mkdir mysql cd mysql 将压缩包复制进mysql文件夹下 tar -xvf mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz mv mysql-8.0.21-linux-glibc2.12-x86_64 mysql8 cd /usr/local/mysql mkdir data 2&#xff0c;创建用户组以及用户密码&…

ComfyUI:Stable Diffusion 及 LoRA、VAE 、ControlNet模型解析

目录 Stable Diffusion流程 扩散过程 去噪过程 checkpoints LoRA LoRA 位置与结构 LoRA 层与原层的关系 LoRA 层的参数拆解 VAE 训练特定 VAE 时更新的参数部分 ControlNet ControlNet 位置与结构 ControlNet 的训练过程 ControlNet 的参数处理与信息融合 Contr…

Python 编程题 第二节:组合数字、乘法口诀表、水仙花数、反向输出四位数、判断三角形

组合数字 1-4不重复组成三位数&#xff0c;利用集合的去重 lst[] for i in range(1,5):for j in range(1,5):for m in range(1,5):s{i,j,m}if len(s)3:lst.append(i*100j*10m) print(lst) 乘法口诀表 修改换行符 for i in range(1,10):for j in range(1,i1):print(f"…

数据存储:一文掌握存储数据到ElasticSearch详解

文章目录 一、Elasticsearch简介二、Python与Elasticsearch交互2.1 安装必要的库2.2 连接到Elasticsearch服务器 三、数据准备四、创建索引&#xff08;可选&#xff09;五、存储数据5.1 单个文档索引5.2 批量索引 六、查询数据七、更新和删除数据7.1 更新文档7.2 删除文档 八、…