具有所有 HTTP 狀態碼的 Java 枚舉
一、簡介
Enum
提供了一種在 Java 程式語言中定義一組命名常數的強大方法。這些對於表示固定的相關值集非常有用,例如 HTTP 狀態碼。眾所周知,Internet 上的所有 Web 伺服器都會發出 HTTP 狀態碼作為標準回應代碼。
在本教程中,我們將深入研究如何建立一個包含所有 HTTP 狀態碼的 Java enum
。
2.了解HTTP狀態碼
HTTP 狀態碼透過通知客戶端請求的結果,在 Web 通訊中發揮著至關重要的作用。此外,伺服器發出這些三位數代碼,它們分為五類,每一類在 HTTP 協定中服務於特定功能。
3. 使用枚舉作為 HTTP 狀態碼的好處
在 Java 中列舉 HTTP 狀態碼具有多個優點,包括:
- 類型安全:使用枚舉確保類型安全,使我們的程式碼更具可讀性和可維護性
- 分組常數:
Enum
將相關常數分組在一起,提供了一種清晰且結構化的方式來處理固定值集 - 避免硬編碼值:將 HTTP 狀態碼定義為枚舉有助於防止硬編碼字串或整數產生錯誤
- 增強清晰度和可維護性:這種方法透過增強清晰度、減少錯誤和提高程式碼可維護性來促進軟體開發的最佳實踐
4. 基本方法
為了有效管理 Java 應用程式中的 HTTP 狀態碼,我們可以定義一個enum
來封裝所有標準 HTTP 狀態碼及其描述。
這種方法使我們能夠利用enum
的好處,例如類型安全性和程式碼清晰度。讓我們從定義HttpStatus
enum
開始:
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 一起使用,我們在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://example.com
的 HTTP GET 請求。透過使用execute()
方法執行請求,我們收到一個CloseableHttpResponse
物件。
從該回應中,我們使用response.getStatusLine().getStatusCode()
提取狀態碼。然後,我們使用HttpStatusUtil.getStatusDescription()
檢索與狀態碼關聯的狀態描述。
最後,我們使用assertEquals()
來確保描述與預期值匹配,驗證我們的狀態碼處理是否準確。
6.使用RestTemplate框架
Spring 框架的 RestTemplate 也可以從我們的HttpStatus
枚舉中受益,用於處理 HTTP 回應。首先,我們在pom.xml
中包含以下依賴項:
<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()
方法以獲取狀態描述。
八、結論
在本文中,我們討論了使用 Java enum
來表示 HTTP 狀態碼,增強程式碼的可讀性、可維護性和類型安全性。
無論我們選擇簡單的enum
定義還是將其與各種 Java 庫(如 Apache HttpComponents、Spring RestTemplate Framework 或 OkHttp)一起使用, Enum
都足夠強大,可以處理 Java 中相關常數的固定集。
像往常一樣,我們可以在 GitHub 上找到完整的原始碼和範例。