处理响应
BodyHandlers 与状态码
处理响应 是 CoddyKit 上的免费 Java Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。
处理响应
HTTP 客户端的每次调用都会返回一个 HttpResponse<T>。泛型类型 T 由您传入的 BodyHandler 决定。本课将介绍可用的处理器,以及如何解释状态码。
HttpResponse API
HttpResponse 的关键方法:
statusCode()— 整数状态码。body()— 类型为T的已解码正文。headers()— 响应头。uri()— 最终 URI(重定向之后)。version()— HTTP/1.1 或 HTTP/2。
BodyHandlers.ofString
最常用的处理器会使用响应中的字符集将正文解码为 String,如果未指定字符集则默认为 UTF-8。响应类型为 HttpResponse<String>。
import java.net.URI;
import java.net.http.*;
public class Main {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create("https://example.com")).build();
HttpResponse<String> res =
client.send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(res.body().length());
}
}BodyHandlers.ofByteArray
对于图像等二进制内容,请使用 ofByteArray()。正文类型会变为 byte[],您可以将其写入磁盘,或自行进行解码。
public class Main {
public static void main(String[] args) {
// ofByteArray() yields HttpResponse<byte[]>
byte[] simulated = { 1, 2, 3, 4 };
System.out.println("Bytes received: " + simulated.length);
}
}BodyHandlers.ofFile
ofFile(path) 会将响应直接流式传输到磁盘,并为您提供一个 HttpResponse<Path>。这样可以避免在内存中缓冲大型下载内容。
import java.net.URI;
import java.net.http.*;
import java.nio.file.Path;
public class Main {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create("https://example.com/file.zip")).build();
HttpResponse<Path> res = client.send(req,
HttpResponse.BodyHandlers.ofFile(Path.of("out.zip")));
System.out.println("Saved to: " + res.body());
}
}BodyHandlers.discarding
如果您只关心状态码和请求头,discarding() 会丢弃正文,并生成 HttpResponse<Void>。这样可以避免缓冲开销。
检查是否成功
一种常见的辅助方法是在信任正文之前,先检查状态码是否处于 2xx 范围内。
public class Main {
static boolean isSuccess(int code) {
return code >= 200 && code < 300;
}
public static void main(String[] args) {
System.out.println(isSuccess(204));
System.out.println(isSuccess(404));
}
}根据状态类别作出响应
根据首位数字进行分支处理,以分别处理成功、重定向和错误。
public class Main {
static String classify(int code) {
return switch (code / 100) {
case 2 -> "Success";
case 3 -> "Redirect";
case 4 -> "Client error";
case 5 -> "Server error";
default -> "Unknown";
};
}
public static void main(String[] args) {
System.out.println(classify(503));
System.out.println(classify(200));
}
}使用 mapping 映射正文
BodyHandlers.mapping(upstream, fn) 会包装另一个处理器并转换其结果。例如,它可以在处理器内部将字符串正文解析为整数长度。
读取特定请求头
要读取响应头的值,请使用 headers().firstValue(name),它会返回一个 Optional<String>。对于重复请求头的所有值,请使用 allValues(name)。
import java.util.Optional;
public class Main {
public static void main(String[] args) {
Optional<String> len = Optional.of("1024");
int contentLength = len.map(Integer::parseInt).orElse(0);
System.out.println("Content-Length: " + contentLength);
}
}选择处理器
- ofString — 文本和 JSON API。
- ofByteArray — 保存在内存中的小型二进制载荷。
- ofFile — 流式传输到磁盘的大型下载内容。
- ofInputStream — 将正文作为流进行处理。
- discarding — 只需要状态码的请求。
快速检查
检验您对响应处理的理解。
回顾
您学会了解读 HTTP 响应:
- HttpResponse 提供
statusCode()、body()和headers()。 - BodyHandler 决定响应体类型:String、byte[]、路径、空值或流。
- 对于大型下载,请使用
ofFile,以避免内存压力。 - 按状态码的首位数字进行分类,并检查 2xx 范围以确认成功。
- 使用
firstValue/allValues读取标头。
常见问题解答
「处理响应」课时是免费的吗?
是的 — 「处理响应」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。
「处理响应」这节课中我会学到什么?
BodyHandlers 与状态码 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Java Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「处理响应」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Java Academy 课中编写并运行代码吗?
能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。