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) { // 200BufferedReader 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); // 开启输出流支持// 请求体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) { // 201System.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

示例代码仓库

为方便学习,所有示例代码已上传到 GitHub:[链接待补充]

如果你对本文内容有疑问,欢迎在评论区交流!


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/888082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始:使用Vite和pnpm搭建Vue3项目实战指南

目录 一、Node.js的下载和安装 1、打开Node.js官网&#xff08;Node.js — Run JavaScript Everywhere&#xff09; 2、点击下载按钮&#xff0c;下载完成后&#xff0c;打开文件&#xff0c;一直按Next按钮&#xff0c;直到 3、下载完成后,找到文件所在位置&#xff0c;然…

立创庐山派 K230 RTSP 推流

立创庐山派使用的是K230芯片&#xff0c;按照教程刷了canmv固件&#xff0c;下载canmv ide&#xff0c;使用嘉楠社区的rtsp和wlan例程&#xff0c;修改成连接wifi以及RTSP推流例程 # Description: This example demonstrates how to stream video and audio to the network us…

数据湖的概念(包含数据中台、数据湖、数据仓库、数据集市的区别)--了解数据湖,这一篇就够了

文章目录 一、数据湖概念1、企业对数据的困扰2、什么是数据湖3、数据中台、数据湖、数据仓库、数据集市的区别 网上看了好多有关数据湖的帖子&#xff0c;还有数据中台、数据湖、数据仓库、数据集市的区别的帖子&#xff0c;发现帖子写的都很多&#xff0c;而且专业名词很多&am…

Multkan

以下是KAN class的逐行解释&#xff0c;这个类是一个用于构建基于核激活网络&#xff08;KAN&#xff09;的神经网络模型的Python类&#xff1a; class KAN:定义一个名为KAN的类。 Attributes:以下部分列出了KAN类的属性&#xff0c;这些属性描述了类的状态和行为。 grid : int…

【案例】权限管理

数据库表结构 models.py from django.db import modelsclass Permission(models.Model):""" 权限表 """code models.CharField(verbose_name"路由名称", max_length32)name models.CharField(verbose_name"名称", max_le…

springboot kafka在kafka server AUTH变动后consumer自动销毁

前言 笔者使用了kafka用来传输数据&#xff0c;笔者在今年10月写了文章&#xff0c;怎么使用配置化实现kafka的装载&#xff1a;springboot kafka多数据源&#xff0c;通过配置动态加载发送者和消费者-CSDN博客 不过在实际运行中&#xff0c;kafka broker是加密的&#xff0c…

在Windows下编译支持https的wsdl2h

下载源码 在官网下载源码 安装Openssl 下载OpenSSL并安装&#xff0c;安装完成后需要将OpenSSL的路径添加到环境变量中 配置VS 1、打开工程 2、因为前面安装的OpenSLL是64位的&#xff0c;因此需要创建一个X64的配置 打开配置管理器&#xff0c;然后选择新建&#xff0…

【Webgl_glslThreejs】制作流水效果/毛玻璃效果材质

效果预览 shadertory源码 source&#xff1a; https://www.shadertoy.com/view/lldyDs 材质代码 import { DoubleSide, ShaderChunk, ShaderMaterial, TextureLoader } from "three"; /** * * source https://www.shadertoy.com/view/lldyDs */export default fu…

个性化联邦学习方法

基于知识蒸馏的个性化联邦学习方法 基于 Logit 的知识蒸馏方法&#xff1a; 基于 logit 的知识蒸馏方法也是知识蒸馏中的一种常见技术。通常&#xff0c;logit 是指模型输出的原始预测值&#xff08;未经过 softmax 函数处理的类别分数&#xff09;。在知识蒸馏中&#xff0c;…

《解锁决策树算法:机器学习领域的实用利器及其多面应用》

一、引言 在当今数据驱动的时代&#xff0c;机器学习正深刻改变着我们生活与工作的方方面面&#xff0c;而决策树算法作为其中的经典算法&#xff0c;凭借直观易懂、高效实用的优势&#xff0c;在众多领域都占据着重要地位。本文将带领大家全方位深入探究决策树算法&#xff0…

vue3+ts+uniapp微信小程序顶部导航栏

这是colorui改的&#xff0c;不用就不用看啦 color-ui(https://docs.xzeu.com/#/) 新建component文件夹创建topNavigation.vue <template><view><view class"cu-custom" :style"height: CustomBar px"><view class"cu-bar…

【AI战略思考13】克服懒惰,保持专注,提升效率,不再焦虑

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 引言 我发现自己最近非常懒惰&#xff0c;浪费了很多时间&#xff0c;也容易分心&#xff0c;不够专注&#xff0c;效率低下&#xff0c;且每天都有点焦虑&#xff0c;因此制定了下面的要求和作息时间表。 目…

Unity3D ngui和ugui区别与优缺点详解

前言 Unity3D是一款跨平台的游戏开发引擎&#xff0c;它支持多种平台&#xff0c;包括PC、移动设备和主机。在Unity3D中&#xff0c;UI系统是游戏开发中非常重要的一部分&#xff0c;它负责游戏中的用户界面的显示和交互。 对惹&#xff0c;这里有一个游戏开发交流小组&#…

openssl使用哈希算法生成随机密钥

文章目录 一、openssl中随机数函数**OpenSSL 随机数函数概览**1. **核心随机数函数** **常用函数详解**1. RAND_bytes2. RAND_priv_bytes3. RAND_seed 和 RAND_add4. RAND_status **随机数生成器的熵池****常见用例****注意事项** 二、使用哈希算法生成随机的密钥 一、openssl中…

大模型翻译能力评测

1. 背景介绍 随着自然语言处理技术的飞速发展&#xff0c;机器翻译已经成为一个重要的研究领域。近年来&#xff0c;基于大模型的语言模型在机器翻译任务上取得了显著的进展。这些大模型通常具有数亿甚至数千亿的参数&#xff0c;能够更好地理解和生成自然语言。 但是&#xf…

刷题日常(找到字符串中所有字母异位词,​ 和为 K 的子数组​,​ 滑动窗口最大值​,全排列)

找到字符串中所有字母异位词 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 题目分析&#xff1a; 1.将p里面的字符先丢进一个hash1中&#xff0c;只需要在S字符里面找到多少个和他相同的has…

【汇编语言】call 和 ret 指令(三) —— 深度解析汇编语言中的批量数据传递与寄存器冲突

文章目录 前言1. 批量数据的传递1.1 存在的问题1.2 如何解决这个问题1.3 示例演示1.3.1 问题说明1.3.2 程序实现 2. 寄存器冲突问题的引入2.1 问题引入2.2 分析与解决问题2.2.1 字符串定义方式2.2.2 分析子程序功能2.2.3 得到子程序代码 2.3 子程序的应用2.3.1 示例12.3.2 示例…

青训营-豆包MarsCode技术训练营试题解析九

介绍 ‌豆包青训营‌是由字节跳动和稀土掘金社区共同发起的技术培训和人才选拔项目&#xff0c;主要面向在校大学生。该项目的目标是培养具有职业竞争力的优秀开发工程师&#xff0c;并提供全程免费的课程&#xff0c;不收取任何费用‌。 课程内容和方向 豆包青训营的课程涵…

前端的面试题

1.常用的块与行属性内标签有哪些&#xff1f;有什么特征&#xff1f; 块标签&#xff1a;div、h1~h6、ul、li、table、p、br、form。 特征&#xff1a;独占一行&#xff0c;换行显示&#xff0c;可以设置宽高&#xff0c;可以嵌套块和行 行标签&#xff1a;span、a、img、text…

`asyncio.wait` 和 `asyncio.gather` 的区别

asyncio.wait 和 asyncio.gather 的区别 1. asyncio.wait2. asyncio.gather主要区别总结 在Python的异步编程中&#xff0c;asyncio.wait 和 asyncio.gather 都是用于等待多个异步任务完成的工具&#xff0c;但它们在功能和使用方式上有一些关键的区别。本文将详细解释这两个函…