Java获取HTTP头信息的实用方法
本篇文章给大家分享《Java读取HTTP头信息方法解析》,覆盖了文章的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。
在Java中解析HTTP响应Header可通过HttpURLConnection或HttpClient实现。1. 使用HttpURLConnection时,调用getHeaderFields()获取所有Header,返回Map
在Java中解析HTTP响应的Header,核心在于利用Java内置的HTTP客户端库来获取服务器返回的头部信息。通常,这会涉及到java.net.HttpURLConnection
或者Java 11及以后版本提供的java.net.http.HttpClient
。无论是哪种方式,目的都是通过请求获取到响应对象,然后从响应对象中提取出所有的头部字段,这些字段通常以键值对的形式存在。

解决方案
要从HTTP响应中读取服务器返回的头部信息,最直接的方法是使用HttpURLConnection
。当你建立连接并获取到响应后,可以通过getHeaderFields()
方法来获取所有头部信息,它会返回一个Map
。这个Map的键是Header的名称(比如"Content-Type"、"Set-Cookie"),值则是一个字符串列表,因为有些Header可能包含多个值(比如"Set-Cookie")。如果你只关心某个特定的Header,也可以使用getHeaderField(String name)
方法,它会返回该Header的第一个值,并且这个方法是大小写不敏感的,用起来比较方便。
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import java.util.Map; public class HttpHeaderParser { public static void main(String[] args) { try { URL url = new URL("https://www.example.com"); // 替换成你想要请求的URL HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(5000); // 5秒连接超时 connection.setReadTimeout(5000); // 5秒读取超时 int responseCode = connection.getResponseCode(); System.out.println("响应状态码: " + responseCode); // 获取所有响应Header Map<String, List<String>> headers = connection.getHeaderFields(); System.out.println("\n--- 所有响应Header ---"); for (Map.Entry<String, List<String>> entry : headers.entrySet()) { // Header名称可能是null,代表状态行 if (entry.getKey() != null) { System.out.println(entry.getKey() + ": " + entry.getValue()); } else { System.out.println("状态行: " + entry.getValue()); } } // 获取特定Header,例如Content-Type String contentType = connection.getHeaderField("Content-Type"); System.out.println("\n--- 特定Header (Content-Type) ---"); System.out.println("Content-Type: " + contentType); // 获取Set-Cookie Header (可能不止一个) List<String> setCookieHeaders = headers.get("Set-Cookie"); if (setCookieHeaders != null && !setCookieHeaders.isEmpty()) { System.out.println("\n--- Set-Cookie Header ---"); for (String cookie : setCookieHeaders) { System.out.println("Set-Cookie: " + cookie); } } // 读取响应体内容 (可选) BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String inputLine; StringBuilder content = new StringBuilder(); while ((inputLine = in.readLine()) != null) { content.append(inputLine); } in.close(); // System.out.println("\n--- 响应体内容 ---"); // System.out.println(content.toString().substring(0, Math.min(content.length(), 200)) + "..."); // 截取部分内容 connection.disconnect(); } catch (Exception e) { e.printStackTrace(); } } }
为什么我们需要关注HTTP响应头?
在我看来,HTTP响应头就像是服务器给客户端发送的一张“说明书”,里面包含了关于响应体内容、服务器状态以及客户端应该如何处理这些内容的各种元数据。忽视它们,就像是只看了一本书的文字,却没看它的封面、目录和版权页,很多关键信息就错过了。

具体来说,关注HTTP响应头的原因有很多:
- 缓存控制:
Cache-Control
、Expires
、ETag
、Last-Modified
这些头告诉浏览器或代理服务器,这个资源可以缓存多久,下次请求时是否需要重新从服务器获取。正确处理这些头能极大提升网站性能,减少不必要的网络请求。我以前就遇到过因为缓存头设置不当,导致用户总是看到旧数据的问题,排查了半天才发现是缓存策略没生效。 - 内容类型与编码:
Content-Type
头(例如text/html; charset=UTF-8
、application/json
)明确告诉客户端响应体的MIME类型和字符编码。这决定了浏览器如何渲染内容,或者应用程序如何解析数据。如果服务器返回的是JSON,但Content-Type
是text/plain
,那客户端可能就无法正确解析了。 - 会话管理:
Set-Cookie
头是服务器向客户端发送Cookie的唯一方式。这些Cookie用于跟踪用户会话、存储用户偏好等。没有它们,Web应用就无法实现登录、购物车等功能。 - 重定向: 当服务器返回3xx状态码(如301、302)时,
Location
头会指定新的URL,告诉客户端应该去哪里获取资源。处理不好这个头,你的应用程序可能就无法正确地跟随重定向链。 - 安全策略:
Content-Security-Policy
(CSP)、X-Frame-Options
、Strict-Transport-Security
(HSTS)等头是现代Web安全的重要组成部分。它们可以有效防止跨站脚本攻击(XSS)、点击劫持、中间人攻击等。作为开发者,理解并利用这些头,是构建安全应用不可或缺的一环。 - 错误与调试: 有些自定义的错误信息或者调试信息会通过特定的Header返回。比如,某些API会在请求失败时,通过
X-Error-Code
或X-Error-Message
提供更详细的错误描述,这对于排查问题非常有帮助。
使用HttpURLConnection解析Header的常见陷阱与技巧
虽然HttpURLConnection
是Java标准库的一部分,使用起来很直接,但在实际开发中,处理其返回的Header时还是有一些需要注意的地方,否则可能会踩坑。

一个常见的“坑”就是Header名称的大小写问题。HTTP规范规定Header名称是大小写不敏感的,但不同的服务器实现可能会返回不同大小写的Header名称(例如Content-Type
、content-type
或Content-type
)。HttpURLConnection
的getHeaderField(String name)
方法是大小写不敏感的,这很方便。但如果你直接遍历getHeaderFields()
返回的Map
,你会发现Map的键可能保持了服务器返回的原始大小写,或者被Java内部规范化了(比如统一为首字母大写或全小写,这取决于具体的Java版本和实现)。我个人觉得,当你需要遍历所有Header时,最好对键进行统一处理,比如都转成小写再进行比较,这样可以避免因为大小写不匹配而找不到Header的情况。
另一个需要注意的,是多值Header的处理。像Set-Cookie
这样的Header,服务器可能会发送多个,每个都代表一个独立的Cookie。getHeaderField(String name)
只会返回第一个值,如果你需要所有的Cookie,就必须使用getHeaderFields()
方法,然后从返回的Map
中获取对应的List
。比如,headers.get("Set-Cookie")
会给你一个包含所有Set-Cookie
值的列表。很多初学者会忽略这一点,导致只处理了第一个Cookie。
连接与读取超时也是一个需要重视的技巧。在上面的代码示例中,我设置了setConnectTimeout()
和setReadTimeout()
。如果不设置,你的应用程序可能会因为网络问题或服务器响应慢而长时间阻塞,导致用户体验下降甚至程序崩溃。这是我从无数次生产环境事故中总结出来的经验,永远不要相信网络是永远可靠的。
最后,关于错误处理,当HTTP请求失败(例如4xx或5xx状态码)时,HttpURLConnection.getInputStream()
可能会抛出IOException
,因为它通常只在成功响应(2xx)时才提供输入流。在这种情况下,你应该尝试使用getErrorStream()
来读取服务器返回的错误信息。这虽然不是直接关于Header的,但与整体的HTTP响应处理紧密相关,是一个经常被忽视的细节。
更现代的Java HTTP客户端:HttpClient与Header处理
随着Java 11的发布,java.net.http.HttpClient
模块提供了一个全新的、更现代、更强大的HTTP客户端API。相比HttpURLConnection
,它支持异步请求、HTTP/2、WebSocket等特性,并且在处理Header方面也更加优雅和直观。
使用HttpClient
获取响应Header的流程大致如下:
- 创建
HttpClient
实例。 - 构建
HttpRequest
对象。 - 发送请求并获取
HttpResponse
。 - 从
HttpResponse
中获取HttpHeaders
对象。
HttpHeaders
对象封装了所有响应头,提供了多种便捷的方法来访问它们,例如firstValue(String name)
用于获取某个Header的第一个值(返回Optional
),allValues(String name)
用于获取某个Header的所有值(返回List
),以及map()
方法可以直接获取到Map
。最棒的是,HttpHeaders
内部已经处理了Header名称的大小写不敏感问题,你无需再手动转换。
import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpHeaders; import java.time.Duration; import java.util.List; import java.util.Optional; import java.util.Map; public class HttpClientHeaderParser { public static void main(String[] args) { HttpClient client = HttpClient.newBuilder() .version(HttpClient.Version.HTTP_2) // 优先使用HTTP/2 .connectTimeout(Duration.ofSeconds(5)) // 连接超时 .build(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://www.example.com")) // 替换成你想要请求的URL .GET() // GET请求 .build(); try { HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println("响应状态码: " + response.statusCode()); // 获取所有响应Header HttpHeaders headers = response.headers(); System.out.println("\n--- 所有响应Header (HttpClient) ---"); headers.map().forEach((name, values) -> System.out.println(name + ": " + values)); // 获取特定Header,例如Content-Type Optional<String> contentType = headers.firstValue("Content-Type"); System.out.println("\n--- 特定Header (Content-Type) ---"); contentType.ifPresent(value -> System.out.println("Content-Type: " + value)); // 获取Set-Cookie Header (可能不止一个) List<String> setCookieHeaders = headers.allValues("Set-Cookie"); if (!setCookieHeaders.isEmpty()) { System.out.println("\n--- Set-Cookie Header ---"); setCookieHeaders.forEach(cookie -> System.out.println("Set-Cookie: " + cookie)); } // 响应体内容 // System.out.println("\n--- 响应体内容 ---"); // System.out.println(response.body().substring(0, Math.min(response.body().length(), 200)) + "..."); } catch (Exception e) { e.printStackTrace(); } } }
在我看来,用了HttpClient
之后,处理HTTP请求和响应,包括Header,都变得异常流畅。特别是异步非阻塞的特性,对于需要处理大量并发请求的应用来说,简直是质的飞跃。它的API设计也更符合现代Java的习惯,链式调用让代码可读性大大提升。如果你正在使用Java 11或更高版本,我强烈建议你优先考虑HttpClient
,它能让你的代码更健壮、更易于维护。
以上就是《Java获取HTTP头信息的实用方法》的详细内容,更多关于java,解析,httpclient,HttpURLConnection,HTTP头信息的资料请关注golang学习网公众号!

- 上一篇
- HTML5蓝牙连接教程:WebBluetoothAPI使用指南

- 下一篇
- Docker配置PHP环境变量全攻略
-
- 文章 · java教程 | 11分钟前 |
- Java异常处理优化技巧分享
- 493浏览 收藏
-
- 文章 · java教程 | 14分钟前 |
- PreparedStatement动态SQL运算符使用技巧
- 264浏览 收藏
-
- 文章 · java教程 | 15分钟前 |
- Java内部类类型与访问控制全解析
- 264浏览 收藏
-
- 文章 · java教程 | 16分钟前 |
- SpringBoot整合RabbitMQ延迟队列详解
- 498浏览 收藏
-
- 文章 · java教程 | 20分钟前 | 读写 Java操作Excel POI库 Workbook SXSSF
- JavaPOI库操作Excel教程详解
- 495浏览 收藏
-
- 文章 · java教程 | 26分钟前 |
- HibernateOneToMany空值问题解决方法
- 139浏览 收藏
-
- 文章 · java教程 | 27分钟前 |
- SpringCloudSleuth追踪教程全解析
- 128浏览 收藏
-
- 文章 · java教程 | 30分钟前 | java 动态网页 HtmlUnit SeleniumWebDriver JS引擎
- Java动态网页抓取:JS引擎解析技巧
- 374浏览 收藏
-
- 文章 · java教程 | 32分钟前 |
- NIO与BIO区别对比及选购建议
- 310浏览 收藏
-
- 文章 · java教程 | 34分钟前 |
- Java登录验证实现步骤详解
- 458浏览 收藏
-
- 文章 · java教程 | 38分钟前 |
- Java注解处理器代码生成实例详解
- 159浏览 收藏
-
- 文章 · java教程 | 53分钟前 | 数据同步 elasticsearch 全文检索 Java后端 小程序搜索
- Java实现小程序搜索功能开发
- 467浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 千音漫语
- 千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
- 96次使用
-
- MiniWork
- MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
- 89次使用
-
- NoCode
- NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
- 107次使用
-
- 达医智影
- 达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
- 98次使用
-
- 智慧芽Eureka
- 智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
- 98次使用
-
- 提升Java功能开发效率的有力工具:微服务架构
- 2023-10-06 501浏览
-
- 掌握Java海康SDK二次开发的必备技巧
- 2023-10-01 501浏览
-
- 如何使用java实现桶排序算法
- 2023-10-03 501浏览
-
- Java开发实战经验:如何优化开发逻辑
- 2023-10-31 501浏览
-
- 如何使用Java中的Math.max()方法比较两个数的大小?
- 2023-11-18 501浏览