HttpClient

1、基础知识

(1)介绍

         HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。它用于发送 HTTP 请求并处理 HTTP 响应。通过这个类,开发者可以方便地进行诸如发起 GET、POST 等常见的 HTTP 请求操作,获取服务器返回的数据, 例如获取网页内容、调用 RESTful API 等。

         在 Java 中,有两种常用方式可以使用 HttpClient 发送 POST 请求,分别是 Java 标准库自带的java.net.http.HttpClient(Java 11 及以上版本可用)和 Apache HttpClient。两种方式都能实现发送 POST 请求的功能。

         java.net.http.HttpClient 是 Java 标准库的一部分,使用起来更加简洁现代;而 Apache HttpClient 功能丰富,有大量的扩展和成熟的生态,在老项目中使用较为广泛。

以下是Apache HttpClient方式的具体使用示例:

(2)pom依赖

HttpClient依赖:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>

阿里云OSS依赖:底层使用httpclient,所以不再需要导入HttpClient依赖

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.10.2</version>
</dependency>

示意图:

(3)核心 API

  • HttpClient:核心接口,定义 HTTP 请求执行等基础方法。
  • HttpClients:工具类,用于创建CloseableHttpClient实例。
  • CloseableHttpClient:HttpClient的实现类,需手动关闭以释放资源。
  • HttpGet:用于构建 HTTP GET 请求,获取服务器资源。
  • HttpPost:用于构建 HTTP POST 请求,向服务器提交数据。

发送请求步骤为:先调用HttpClients的方法创建HttpClient对象,再创建 HTTP 请求对象(如HttpGet或HttpPost),最后调用HttpClient的execute方法发送请求。

2、入门案例

创建HttpClientTest

(1)HttpGet测试

通过本地获取响应,使用User客户端获取店铺营业状态(记得打开Redis,否则响应码为500

获取地址:http://localhost:8080/user/shop/status

当然也可以请求其他的地址如百度:百度一下,你就知道

位置:sky-server/src/test/java/com/sky/HttpClientTest.java

具体代码:

package com.sky;
 
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
 
import java.net.http.HttpClient;//后续要删除
 
@SpringBootTest
public class HttpClientTest {
 
    @Test
    public void testGet() throws Exception {
        //创建一个HttpClient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
 
        //创建一个请求对象,指定请求方法为GET,请求地址为
        HttpGet httpGet = new HttpGet("http://localhost:8080/user/shop/status");
 
        //发送请求,并获取响应
        CloseableHttpResponse response = httpClient.execute(httpGet);
 
        //解析响应码
        int statusCode = response.getStatusLine().getStatusCode();
        System.out.println("服务端返回的状态码: " + statusCode);
 
        //获取响应内容
        HttpEntity entity = response.getEntity();
        String body = EntityUtils.toString(entity);
        System.out.println("服务端返回的响应内容: " + body);
 
        //关闭资源
        response.close();
        httpClient.close();//
    }
}

示意图:

错误显示:

 java: 程序包java.net.http不存在

错误可能原因:

 我们导入了"import java.net.http.HttpClient;"而在前面我们已经导入“import org.apache.http.HttpEntity;”而我们的代码实际使用的是 Apache HttpClient(org.apache.http 相关类)也就是已经导入,但却错误导入了 Java 标准库的 java.net.http.HttpClient,编译器虽不会强制报错,但会导致不必要的混淆(比如这次的 “包不存在” 错误),而显示包不存在的核心原因是 JDK 版本不兼容——java.net.http.HttpClient 是 Java 11 及以上版本才加入的标准库类,若你的项目使用的 JDK 版本低于 11,即使写了导入语句,JDK 里也根本没有这个包,自然会提示 “包不存在”

解决办法:

(1)删除“import java.net.http.HttpClient;”

 代码逻辑:所有 HTTP 操作都基于 Apache HttpClient(org.apache.http包下的类),与java.net.http无关,删除后错误就会消失。

(2)IDE 配置

 以 IDEA 为例,进入「File → Project Structure → Project Settings」,确认「Project SDK」和「Project language level」均设置为 17。

(2)HttpPost测试

添加的代码:

  /**
     * 测试通过httpclient发送POST方式的请求
     */
    @Test
    public void testPOST() throws Exception{
        // 创建httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
 
        //创建请求对象,指定请求方法为POST,请求地址为http://localhost:8080/admin/employee/login
        HttpPost httpPost = new HttpPost("http://localhost:8080/admin/employee/login");
 
        //设置请求参数,由于参数是json格式,因此需要设置请求编码方式和数据格式
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("username","admin");
        jsonObject.put("password","123456");
 
        StringEntity entity = new StringEntity(jsonObject.toString());
        //指定请求编码方式
        entity.setContentEncoding("utf-8");
        //数据格式
        entity.setContentType("application/json");
        //设置请求参数
        httpPost.setEntity(entity);
 
        //发送请求
        CloseableHttpResponse response = httpClient.execute(httpPost);
 
        //解析返回结果
        int statusCode = response.getStatusLine().getStatusCode();
        System.out.println("响应码为:" + statusCode);
 
        HttpEntity entity1 = response.getEntity();
        String body = EntityUtils.toString(entity1);
        System.out.println("响应数据为:" + body);
 
        //关闭资源
        response.close();
        httpClient.close();
    }

示意图:

测试结束后记得把@SpringBootTest注释掉,否则每次启动项目都会执行这些测试案例

3、示例

(1)GET 请求的示例

以下是一个简单的使用java.net.http.HttpClient发送 GET 请求的示例:

代码:

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
 
public class Main {
    public static void main(String[] args) throws IOException, InterruptedException {
        // 创建HttpClient实例
        HttpClient client = HttpClient.newHttpClient();
        // 创建HttpRequest请求,指定请求的URI(这里以百度首页为例)
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://www.baidu.com"))
                .build();
        // 发送请求并获取HttpResponse响应
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        // 输出响应状态码
        System.out.println("响应状态码: " + response.statusCode());
        // 输出响应体内容
        System.out.println("响应体: " + response.body());
    }
}

代码解释:

在上述代码中,通过导入 java.net.http.HttpClient 以及相关的类,实现了向百度首页发送 GET 请求,并获取和处理响应的功能。

(2)POST 请求示例

使用HttpClient 发送 POST 请求示例

代码:

import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
 
import java.io.IOException;
 
public class ApachePostRequestExample {
    public static void main(String[] args) {
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            // 创建HttpPost对象,指定请求URL
            HttpPost httpPost = new HttpPost("http://example.com/api/endpoint");
            // 构建请求体,这里同样以JSON数据为例
            String jsonBody = "{\"key\":\"value\",\"name\":\"John\"}";
            StringEntity entity = new StringEntity(jsonBody);
            entity.setContentType("application/json");
            httpPost.setEntity(entity);
            // 发送请求并获取响应
            try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
                // 获取响应状态码
                int statusCode = response.getStatusLine().getStatusCode();
                System.out.println("响应状态码: " + statusCode);
                // 获取响应体内容
                HttpEntity responseEntity = response.getEntity();
                if (responseEntity != null) {
                    String responseBody = EntityUtils.toString(responseEntity);
                    System.out.println("响应体: " + responseBody);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐