Java 枚舉與所有 HTTP 狀態碼

Java Web,REST
Remote
0
03:15 AM · Dec 01 ,2025

1. 介紹

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

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

2. 瞭解 HTTP 狀態碼

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

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

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

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

4. 基本方法

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

這種方法允許我們利用 枚舉 的優勢,例如類型安全和代碼清晰度。讓我們首先定義 HttpStatus 枚舉

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;
    }
}

此常量中的每個 枚舉 常量都與整數代碼和字符串描述相關聯。 此外,構造函數初始化這些值,並且我們提供 getter 方法以檢索它們。

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

@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() 方法返回 枚舉 常量的正確整數代碼。 類似地,第二個測試方法確保 getDescription() 方法返回適當的字符串描述。

5. 使用 Apache HttpComponents

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

<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 請求。 然後,我們使用 new HttpGet(“http://example.com”)構造一個 HTTP GET 請求到 http://example.com。 通過使用 execute() 方法執行請求,我們收到一個 CloseableHttpResponse 對象。

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

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

6. 使用 RestTemplate 框架

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

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

我們可以在 Maven Central (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 (https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp/) 找到有關此依賴項的更多詳細信息。

現在,讓我們將我們的 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.