0Pricing
Java Academy · 课时

处理响应

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. java.net.http.HttpClient
  2. 异步请求
  3. 请求正文与标头
  4. 处理响应
← 返回 Java Academy