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

Java中 HttpURLConnection 和 HttpClient 详解(初学者友好)

Java中HttpURLConnectionHttpClient详解(初学者友好)

在Java开发中,向服务器发送HTTP请求是常见的需求,比如调用API接口或获取远程数据。在JDK中,主要有两种方式实现HTTP通信:

  1. 使用 HttpURLConnection(JDK自带)。
  2. 使用 HttpClient(JDK 11 引入的新API,推荐方式)。

本文将全面讲解这两种方式,包括基本用法、优缺点以及适用场景。


一、HttpURLConnection详解

HttpURLConnection 是JDK内置的HTTP请求工具类,无需额外依赖库。它适用于简单的HTTP请求处理。

1. 基本用法

下面是使用 HttpURLConnection 发送 GET 和 POST 请求的示例代码。

(1)GET 请求示例
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpURLConnectionGetExample {
    public static void main(String[] args) {
        try {
            String urlString = "https://jsonplaceholder.typicode.com/posts/1";
            URL url = new URL(urlString);

            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");

            // 设置请求头
            connection.setRequestProperty("User-Agent", "Mozilla/5.0");

            // 检查响应码
            int responseCode = connection.getResponseCode();
            System.out.println("Response Code: " + responseCode);

            // 读取响应
            if (responseCode == HttpURLConnection.HTTP_OK) { // 200
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String inputLine;
                StringBuilder response = new StringBuilder();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();

                System.out.println("Response: " + response.toString());
            } else {
                System.out.println("GET request failed.");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
(2)POST 请求示例
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpURLConnectionPostExample {
    public static void main(String[] args) {
        try {
            String urlString = "https://jsonplaceholder.typicode.com/posts";
            URL url = new URL(urlString);

            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");

            // 设置请求头
            connection.setRequestProperty("Content-Type", "application/json; utf-8");
            connection.setRequestProperty("Accept", "application/json");
            connection.setDoOutput(true); // 用于设置HTTP请求是否允许向服务器发送数据

            // 请求体
            String jsonInputString = "{ \"title\": \"foo\", \"body\": \"bar\", \"userId\": 1 }";

            // 发送数据
            try (OutputStream os = connection.getOutputStream()) {
                byte[] input = jsonInputString.getBytes("utf-8");
                os.write(input, 0, input.length);
            }

            // 检查响应码
            int responseCode = connection.getResponseCode();
            System.out.println("Response Code: " + responseCode);

            if (responseCode == HttpURLConnection.HTTP_CREATED) { // 201
                System.out.println("POST request successful.");
            } else {
                System.out.println("POST request failed.");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2. 优缺点

优点:

  • 内置类,无需添加依赖。
  • 易于实现简单的HTTP请求。

缺点:

  • 使用较复杂,代码冗长。
  • 不支持异步。
  • 不便于维护和扩展。

二、HttpClient详解

HttpClient 是 JDK 11 新引入的 HTTP 通信工具,功能强大,支持同步和异步模式。

1. 基本用法

(1)GET 请求示例
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class HttpClientGetExample {
    public static void main(String[] args) {
        try {
            HttpClient client = HttpClient.newHttpClient();
            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://jsonplaceholder.typicode.com/posts/1"))
                .GET()
                .build();

            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
            System.out.println("Response Code: " + response.statusCode());
            System.out.println("Response Body: " + response.body());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
(2)POST 请求示例
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class HttpClientPostExample {
    public static void main(String[] args) {
        try {
            HttpClient client = HttpClient.newHttpClient();
            String jsonInputString = "{ \"title\": \"foo\", \"body\": \"bar\", \"userId\": 1 }";

            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://jsonplaceholder.typicode.com/posts"))
                .header("Content-Type", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString(jsonInputString))
                .build();

            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
            System.out.println("Response Code: " + response.statusCode());
            System.out.println("Response Body: " + response.body());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
(3)异步请求示例
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.concurrent.CompletableFuture;

public class HttpClientAsyncExample {
    public static void main(String[] args) {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://jsonplaceholder.typicode.com/posts/1"))
            .build();

        CompletableFuture<HttpResponse<String>> responseFuture = client.sendAsync(
            request, HttpResponse.BodyHandlers.ofString()
        );

        responseFuture.thenAccept(response -> {
            System.out.println("Response Code: " + response.statusCode());
            System.out.println("Response Body: " + response.body());
        }).join(); 
        //这里的 .join()是一个阻塞方法,调用这个方法,可以使当前线程(通常是主线程)等待
        //直到responseFuture完成,避免程序过早退出(单元测试和多异步任务结果合并时常用join方法)
    }
}

2. 优缺点

优点:

  • 简洁且现代化的API。
  • 支持同步和异步。
  • 支持HTTP/2。

缺点:

  • 需要 JDK 11+ 支持。

三、如何选择?

  • 简单项目: 如果你的项目无需频繁发送复杂的HTTP请求,HttpURLConnection 足够。
  • 复杂项目: 推荐使用 HttpClient,它更加现代化、功能全面。

四、总结

HttpURLConnectionHttpClient 是 Java 开发中常用的 HTTP 请求工具。对于初学者,建议从简单的 HttpURLConnection 开始掌握基本原理,然后再学习功能更丰富的 HttpClient


希望以上内容能够帮助到大家掌握 Java 的 HTTP 请求!欢迎点赞、收藏、评论支持! 😊


http://www.kler.cn/a/418894.html

相关文章:

  • go-学习
  • 【YOLO系列复现】二、基于YOLOv6的目标检测:YOLOv6训练自己的数据集(史诗级详细教程)
  • 「Mac畅玩鸿蒙与硬件35」UI互动应用篇12 - 简易日历
  • 基于Matlab实现三维点坐标生成点云(源码+数据)
  • TCP三次握手与四次挥手(TCP重传机制,2MSL)超详细!!!计算机网络
  • 【Android】EventBus的使用及源码分析
  • 【从零开始的LeetCode-算法】3208. 交替组 II
  • 【Git教程 之 版本控制】
  • 深入探讨SQL优化原理 - 增量查询和索引加速
  • JavaScript 高级教程:异步编程、面向对象与性能优化
  • EC2还原快照
  • 探索3D世界:使用 lib3ds 读取和解析 3DS 文件
  • CentOS使用chrony服务进行时间同步源设置脚本
  • CSS3网站
  • 欧拉函数——acwing
  • 挑战用React封装100个组件【005】
  • 【linux】(23)对象存储服务-MinIo
  • Linux 僵尸进程和孤儿进程, 进程优先级
  • Android 12.0新增自定义HIDL问题记录
  • 内网穿透步骤
  • Spring Data JPA(二) 高级进阶
  • linux——进程间通信及管道的应用场景
  • 蓝桥杯经验分享
  • 医院分诊管理系统|Java|SSM|VUE| 前后端分离
  • 2. STM32_中断
  • 深入理解 PyTorch .pth 文件和 Python pickle 模块:功能、应用及实际示例