知識庫 / REST RSS 訂閱

Java 枚舉與所有 HTTP 狀態碼

Java Web,REST
HongKong
9
03:35 AM · Dec 06 ,2025

1. 引言

枚舉 (Enum) 提供了一種強大的方式來定義 Java 編程語言中一組命名常量。這些常量對於表示固定相關的值集非常有用,例如 HTTP 狀態碼。正如我們所知,互聯網上的所有 Web 服務器都以標準響應碼的形式發出 HTTP 狀態碼。

在本教程中,我們將深入研究如何創建一個 Java 枚舉,其中包含所有 HTTP 狀態碼。

2. 理解 HTTP 狀態碼

HTTP 狀態碼在 Web 通信中發揮着至關重要的作用,通過告知客户端請求的結果,從而提供反饋。 此外,服務器還會發出這些三位數字的代碼,這些代碼分為五類,每類都針對 HTTP 協議中的特定功能而服務。

3. 使用枚舉處理HTTP狀態碼的優勢

枚舉Java中的HTTP狀態碼提供了一些優勢,包括:

  • 類型安全:使用enum 確保類型安全,使我們的代碼更具可讀性和可維護性
  • 分組常量:Enum 將相關的常量分組在一起,提供了一種清晰、結構化的方式來處理固定值的集合
  • 避免硬編碼值:將HTTP狀態碼定義為enum 有助於防止因硬編碼字符串或整數而產生的錯誤
  • 增強清晰度和可維護性:這種方法通過增強清晰度、減少錯誤並提高代碼可維護性,從而促進軟件開發中的最佳實踐

4. 基本方法

為了有效地管理 Java 應用程序中的 HTTP 狀態碼,我們可以定義一個 枚舉 (enum)</ em>,其中封裝了所有標準 HTTP 狀態碼及其描述。

這種方法可以利用 枚舉 (enum)</ em> 的優勢,例如類型安全性和代碼清晰度。讓我們首先定義 HttpStatus</ em> 枚舉 (enum)</ em>:

public enum HttpStatus {
    CONTINUE(100, "Continue"),
    SWITCHING_PROTOCOLS(101, "Switching Protocols"),
    OK(200, "OK"),
    CREATED(201, "Created"),
    ACCEPTED(202, "Accepted"),
    MULTIPLE_CHOICES(300, "Multiple Choices"),
    MOVED_PERMANENTLY(301, "Moved Permanently"),
    FOUND(302, "Found"),
    BAD_REQUEST(400, "Bad Request"),
    UNAUTHORIZED(401, "Unauthorized"),
    FORBIDDEN(403, "Forbidden"),
    NOT_FOUND(404, "Not Found"),
    INTERNAL_SERVER_ERROR(500, "Internal Server Error"),
    NOT_IMPLEMENTED(501, "Not Implemented"),
    BAD_GATEWAY(502, "Bad Gateway"),
    UNKNOWN(-1, "Unknown Status");

    private final int code;
    private final String description;

    HttpStatus(int code, String description) {
        this.code = code;
        this.description = description;
    }

    public static HttpStatus getStatusFromCode(int code) {
        for (HttpStatus status : HttpStatus.values()) {
            if (status.getCode() == code) {
                return status;
            }
        }
        return UNKNOWN;
    }

    public int getCode() {
        return code;
    }

    public String getDescription() {
        return description;
    }
}

每個常量在該 枚舉 (Enum) 中都與整數代碼和字符串描述相關聯。 此外,構造函數初始化這些值,我們還提供了獲取它們的 getter 方法。

讓我們創建單元測試以確保我們的 HttpStatus 枚舉 (Enum) 類正常工作:

@Test
public void givenStatusCode_whenGetCode_thenCorrectCode() {
    assertEquals(100, HttpStatus.CONTINUE.getCode());
    assertEquals(200, HttpStatus.OK.getCode());
    assertEquals(300, HttpStatus.MULTIPLE_CHOICES.getCode());
    assertEquals(400, HttpStatus.BAD_REQUEST.getCode());
    assertEquals(500, HttpStatus.INTERNAL_SERVER_ERROR.getCode());
}

@Test
public void givenStatusCode_whenGetDescription_thenCorrectDescription() {
    assertEquals("Continue", HttpStatus.CONTINUE.getDescription());
    assertEquals("OK", HttpStatus.OK.getDescription());
    assertEquals("Multiple Choices", HttpStatus.MULTIPLE_CHOICES.getDescription());
    assertEquals("Bad Request", HttpStatus.BAD_REQUEST.getDescription());
    assertEquals("Internal Server Error", HttpStatus.INTERNAL_SERVER_ERROR.getDescription());
}

在這裏,我們驗證 getCode()getDescription() 方法在各種 HTTP 狀態碼下返回正確的值。第一個測試方法檢查 getCode() 方法是否返回每個 enum 常量的正確整數代碼。 類似地,第二個測試方法確保 getDescription() 方法返回適當的字符串描述。

5. 使用 Apache HttpComponents

Apache HttpComponents 是一個流行的 HTTP 通信庫。要使用它與 Maven 集成,我們在 <em pom.xml</em> 中包含以下依賴項:

<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.3.1</version>
</dependency>

我們可以在 Maven Central 找到有關此依賴項的更多詳細信息。

我們可以使用我們的 HttpStatus 枚舉 來處理 HTTP 響應:

@Test
public void givenHttpRequest_whenUsingApacheHttpComponents_thenCorrectStatusDescription() throws IOException {
    CloseableHttpClient httpClient = HttpClients.createDefault();
    HttpGet request = new HttpGet("http://example.com");
    try (CloseableHttpResponse response = httpClient.execute(request)) {
        String reasonPhrase = response.getStatusLine().getReasonPhrase();
        assertEquals("OK", reasonPhrase);
    }
}

在這裏,我們首先使用 createDefault() 方法創建一個 CloseableHttpClient 實例。 此外,該客户端負責發起 HTTP 請求。 然後,我們構造一個 HTTP GET 請求到 http://example.com,使用 new HttpGet(“http://example.com”)。 通過使用 execute() 方法執行請求,我們收到一個 CloseableHttpResponse 對象。

從該響應中,我們使用 response.getStatusLine().getStatusCode() 提取狀態碼。 然後,我們使用 HttpStatusUtil.getStatusDescription() 檢索與狀態碼相關的狀態描述。

最後,我們使用 assertEquals() 確保描述與預期值匹配,從而驗證我們的狀態碼處理的準確性。

6. 使用 RestTemplate 框架

Spring Framework 的 RestTemplate 也可以從我們的 <em >HttpStatus</em> 枚舉 中受益,用於處理 HTTP 響應。首先,讓我們在我們的 <em >pom.xml</em> 中包含以下依賴項:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>6.1.11</version>
</dependency>

我們可以通過 Maven Central 查找有關此依賴項的更多詳細信息。

讓我們探討如何使用這種方法,通過一個簡單的實現:

@Test
public void givenHttpRequest_whenUsingSpringRestTemplate_thenCorrectStatusDescription() {
    RestTemplate restTemplate = new RestTemplate();
    ResponseEntity<String> response = restTemplate.getForEntity("http://example.com", String.class);
    int statusCode = response.getStatusCode().value();
    String statusDescription = HttpStatus.getStatusFromCode(statusCode).getDescription();
    assertEquals("OK", statusDescription);
}

在這裏,我們創建一個 RestTemplate 實例來執行 HTTP GET 請求。 在獲取 ResponseEntity 對象後,我們使用 response.getStatusCode().value() 提取狀態碼。 然後,我們將此狀態碼傳遞給 HttpStatus.getStatusFromCode.getDescription() 以檢索相應的狀態描述。

7. 使用 OkHttp 庫

OkHttp 是一款在 Java 中廣泛使用的 HTTP 客户端庫。我們將通過在我們的 pom.xml中添加以下依賴項來將該庫集成到 Maven 項目中:

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.12.0</version>
</dependency>

我們可以在 Maven Central 找到更多關於此依賴項的詳細信息。

現在,讓我們將我們的 HttpStatus 枚舉OkHttp 集成,以處理響應:

@Test
public void givenHttpRequest_whenUsingOkHttp_thenCorrectStatusDescription() throws IOException {
    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder()
      .url("http://example.com")
      .build();
    try (Response response = client.newCall(request).execute()) {
        int statusCode = response.code();
        String statusDescription = HttpStatus.getStatusFromCode(statusCode).getDescription();
        assertEquals("OK", statusDescription);
    }
}

在本測試中,我們初始化一個 OkHttpClient 實例,並使用 Request.Builder() 創建一個 HTTP GET 請求。 然後,我們使用 client.newCall(request).execute() 方法執行請求,並獲取 Response 對象。 我們使用 response.code() 方法提取狀態碼,並將其傳遞給 HttpStatus.getStatusFromCode.getDescription() 方法以獲取狀態描述。

8. 結論

在本文中,我們探討了使用 Java 的 枚舉 (enum) 來表示 HTTP 狀態碼的方法,從而提高代碼的可讀性、可維護性和類型安全性。

無論我們選擇使用簡單的 枚舉 (enum) 定義,還是將其與諸如 Apache HttpComponents、Spring RestTemplate Framework 或 OkHttp 等各種 Java 庫結合使用,枚舉 (enum) 都能可靠地處理 Java 中固定集合的相關常量。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.