Java 中的 API 是什麼?
1. 簡介
API(應用程式介面)在不同軟體系統之間的通訊中起著至關重要的作用。無論我們整合第三方服務還是 RESTful Web 服務,了解 API 開發對於建立現代 Web 應用程式都至關重要。
在本文中,我們將簡要探討 Java 環境中的 API 是什麼,了解其重要性,甚至查看它的一個範例以開始 API 開發。
2.什麼是 API?
讓我們透過一個真實的例子來理解 API。當我們去餐廳時,我們只需看菜單並點菜。我們不需要知道廚房裡是如何準備食物的。
類似地,Java 中的 API 是一組方法和類別,我們開發人員使用它們時無需擔心它們內部如何運作。
例如,假設我們要建立一個天氣預報應用程式。我們不需要手動收集資料並進行計算,只需使用第三方提供的天氣 API 即可。天氣 API 可能會公開各種端點(將它們視為我們可以透過網路呼叫的方法)以取得我們可能需要的各種資料。
API 在現代應用程式建置中被廣泛使用。現代應用程式遵循基於元件的架構,其中應用程式被分成多個具有獨立功能的小部分,所有這些元件透過公開其 API 相互通訊。
3. API 的類型
在 Java 中,我們根據用途有不同類型的 API,如下所示。
3.1. Web API
Web API 可協助我們透過 Web 與其他 Web 應用程式進行互動。這可能意味著向另一個公開其 API 的 Web 應用程式發出 HTTP 請求或在同一應用程式內的各個元件之間進行通訊。
例如,PayPal API 允許電子商務應用程式處理付款。 YouTube API 允許開發人員將影片新增至他們的應用程式等。
我們有不同類型的 Web API,其中 RESTful API 是最常用的 API 之一。它們依靠 URL 來識別資源並使用標準 HTTP 方法(GET、POST、PUT、DELETE)來傳送和接收資料。
SOAP API 雖然較舊,但更安全,並用於銀行和金融系統。 GraphQL 是另一種更靈活的 API,允許客戶端僅請求他們需要的特定資料。
3.2.作業系統 API
Java 提供作業系統 API,幫助我們與作業系統特定的功能進行交互,例如檔案處理、網路存取等。
Java NIO(新 I/O API)、Java Process API 和 Java Preferences API 是允許我們執行 OS 任務的一些範例。
3.3.資料庫 API
資料庫 API 允許我們透過連接資料庫來執行 CRUD 操作。一些範例包括 JDBC(Java 資料庫連線)、JPA(Java 持久性 API)和 Spring Data JPA。
3.4.硬體 API
Java 還提供與印表機、相機、感測器等硬體元件互動的 API。 Java Sound API 和 Java Print API 就是其中的一些範例。
在本文中,我們將重點放在使用 Java 建立的 RESTful API。
4.建立 CRUD API
現在讓我們建立一個執行 CRUD 操作的 REST API。實現此目的的最簡單方法之一是使用HttpServer
。 HttpServer
是輕量級的,非常適合小型專案和學習 REST API 的工作原理。
我們首先建立一個 Maven 項目,然後在src/main/java
中建立一個名為RestApiServer
的類別文件,其中我們將包含main()
方法以及處理傳入請求和執行 CRUD 操作的程式碼。
4.1.建立 HTTP 伺服器
在main()
方法內部,我們將建立一個 HTTP 伺服器,監聽連接埠 8080 並允許在/users
端點傳入 HTTP 請求。下面的程式碼演示了這一點:
public static void main(String[] args) throws IOException {
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
server.createContext("/users", new RestApiServer());
server.setExecutor(null);
System.out.println("Server started at http://localhost:8080/users");
server.start();
}
server.createContext(“/users”, new RestApiServer())
為/users
端點註冊一個處理程序。即,任何傳送至http://localhost:8080/users
HTTP 請求都將由RestApiServer
的實例處理。
我們也使用server.setExecutor(null)
來配置伺服器,這表示它將使用預設執行緒池來處理傳入的請求。最後,當我們執行程式時, server.start()
啟動伺服器。
4.2.實作handle()
方法
為了處理傳入的請求, RestApiServer
類別實作了HttpHandler
接口,該接口帶有handle()
方法。我們需要重寫handle()
方法並提供邏輯來檢查傳入的請求並呼叫對應的處理函數。
下面是handle()
方法的實作:
@Override
public void handle(HttpExchange exchange) throws IOException {
String method = exchange.getRequestMethod();
switch (method) {
case "GET" -> handleGet(exchange);
case "POST" -> handlePost(exchange);
case "PUT" -> handlePut(exchange);
case "DELETE" -> handleDelete(exchange);
default -> sendResponse(exchange, 405, "Method Not Allowed");
}
}
4.3.處理請求
接下來,讓我們探討這些單獨的方法以及它們如何處理執行 CRUD 操作的請求。為了盡可能簡單,我們不會使用實體和儲存庫。我們只需使用類別內部的List
來維護使用者清單。
如果傳入請求是 GET 請求,我們將呼叫handleGet()
方法,該方法將只傳回用途清單。下面是相同的程式碼:
private void handleGet(HttpExchange exchange) throws IOException {
sendResponse(exchange, 200, users.toString());
}
接下來,讓我們來看看處理 POST 請求的handlePost()
方法。此方法將在檢查使用者不為空後建立/新增使用者。
下面是相同的程式碼:
private void handlePost(HttpExchange exchange) throws IOException {
String newUser = readRequestBody(exchange);
if (!newUser.isBlank()) {
users.add(newUser);
sendResponse(exchange, 201, "User added: " + newUser);
} else {
sendResponse(exchange, 400, "Invalid user data");
}
}
現在讓我們來看看handlePut()
方法,它將更新指定索引處的現有使用者。
下面是相同的程式碼:
private void handlePut(HttpExchange exchange) throws IOException {
String body = readRequestBody(exchange);
String[] parts = body.split(":", 2);
if (parts.length == 2) {
int index = Integer.parseInt(parts[0]);
String newName = parts[1];
if (index >= 0 && index < users.size()) {
users.set(index, newName);
sendResponse(exchange, 200, "User updated: " + newName);
} else {
sendResponse(exchange, 404, "User not found");
}
} else {
sendResponse(exchange, 400, "Invalid input format");
}
}
它首先使用readRequestBody(exchange)
讀取請求主體,預計傳回一個包含「index:newName」格式的使用者資料的字串。如果輸入格式分為兩部分,它將檢查提供的索引是否存在於使用者清單中。如果有效,它會新增使用者並傳回 200 OK 狀態和成功訊息。
如果索引超出範圍,則假定指定索引中沒有使用者並傳回 400 Bad Request 錯誤。
接下來我們也會有一個類似的方法來執行使用者的刪除。下面是相同的程式碼:
private void handleDelete(HttpExchange exchange) throws IOException {
String body = readRequestBody(exchange);
int index;
try {
index = Integer.parseInt(body);
if (index >= 0 && index < users.size()) {
String removedUser = users.remove(index);
sendResponse(exchange, 200, "User deleted: " + removedUser);
} else {
sendResponse(exchange, 404, "User not found");
}
} catch (NumberFormatException e) {
sendResponse(exchange, 400, "Invalid index");
}
}
首先,我們讀取請求主體,看看它是否包含一個表示要刪除的使用者索引的整數。如果索引有效,它會嘗試從該索引中刪除用戶,並以 200 OK 狀態和確認訊息進行回應。如果索引超出範圍或無效,將傳回 404 未找到錯誤。
我們還有幾種方法來讀取請求正文並以有意義的方式發送回應。以下是讀取請求的程式碼:
private String readRequestBody(HttpExchange exchange) throws IOException {
InputStream is = exchange.getRequestBody();
return new String(is.readAllBytes(), StandardCharsets.UTF_8);
}
以下是寫入回應的程式碼:
private void sendResponse(HttpExchange exchange, int statusCode, String response) throws IOException {
exchange.sendResponseHeaders(statusCode, response.length());
OutputStream os = exchange.getResponseBody();
os.write(response.getBytes(StandardCharsets.UTF_8));
os.close();
}
5.測試應用程式
要運行應用程式並測試我們的 API,我們不需要外部伺服器,我們可以使用嵌入式 HTTP 伺服器。以下是測試我們的 API 的步驟。
我們必須先使用 Maven 打包我們的專案並建立一個jar
檔。在 Windows 中開啟 PowerShell,並在專案目錄中執行以下命令:
mvn clean package
之後,我們需要轉到專案目錄並使用以下命令運行我們的類別檔案(假設我們的類別在com.example.rest
包中),這應該在連接埠 8080 啟動我們的伺服器:
java -cp .\target\my-crud-app-0.0.1-SNAPSHOT.jar com.example.rest.RestApiServer
現在,在 PowerShell 內部,我們使用curl
進行 API 呼叫。
為了獲取所有用戶,我們需要執行以下命令:
curl.exe -X GET http://localhost:8080/users
以下命令用於新增使用者(發送 POST 請求):
curl.exe -X POST -d "Alice" http://localhost:8080/users
我們使用以下命令來更新現有用戶:
curl.exe -X PUT -d "0:Bob" http://localhost:8080/users
最後,我們使用以下命令刪除現有用戶:
curl.exe -X DELETE -d "0" http://localhost:8080/users
6. 外部函式庫/框架
為了建立現代應用程序,我們使用具有增強功能、易用性和可擴展性的更先進的框架。這些框架簡化了依賴關係管理,支援依賴注入,提高了安全性,並促進了資料庫互動。
在本節中,我們將探討一些用於 API 開發的最受歡迎的程式庫和框架。
6.1. Spring Boot
Spring Boot 透過簡化建置生產就緒應用程式的過程徹底改變了我們建立 Java 應用程式的方式。透過自動配置等功能,Spring Boot 無需大量手動配置。
它還支援依賴注入,並附帶嵌入式 Tomcat 伺服器,支援建立現代分散式應用程式。
開發人員可以使用 Spring Boot 的註解(如@RestController
和@RequestMapping
)輕鬆建立 RESTful 服務,從而減少了基於 XML 配置的需要。
借助 Spring Data JPA,我們可以無縫與資料庫集成,以最小的努力有效地完成 CRUD 操作。
此外,Spring Boot 與微服務架構的兼容性,結合 Spring Cloud 等工具,使其成為建立企業級應用程式的首選。
6.2.雅加達企業電子郵件信箱
Jakarta EE(以前稱為 Java EE)是一種流行且功能強大的企業框架,用於建立大規模分散式應用程式。它提供了一套全面的 API,例如用於 RESTful Web 服務的 JAX-RS、用於資料庫操作的 JPA 以及用於管理依賴關係的 CDI(上下文和依賴注入)。
與具有嵌入式伺服器和其他功能的 Spring Boot 不同,Jakarta EE 在 WildFly、Payara 或 Open Liberty 等應用程式伺服器上運行。
Jakarta EE 允許開發人員建立可擴展且強大的應用程序,並內建對事務管理、訊息傳遞(JMS)和安全性的支援。它採用更傳統的方法,透過 web.xml 或註解處理配置,適合需要嚴格遵守 Java EE 標準的企業。
6.3. JAX-RS
JAX-RS(RESTful Web 服務的 Java API)是用於建立 RESTful Web 服務的 Java 標準。在 Spring Boot 流行之前,這種技術很常用。它是被廣泛採用的框架之一,使用一組註解使 API 開發更簡單、更具聲明性。
與具有依賴注入和安全性等功能的 Spring Boot 不同,JAX-RS 僅專注於 RESTful API 開發,這使其輕量且高效。
JAX-RS 支援@GET
、 @POST
、 @PUT
、 @DELETE
和@Path
等註釋,讓開發人員定義端點而無需手動基於 XML 的配置。它還具有請求過濾、異常處理和內容協商等功能,是 API 開發的理想選擇。 Jersey(由 Oracle 開發)和 RESTEasy(由 JBoss 開發)是 JAX-RS 的一些流行實作。
7. 結論
在本文中,我們了解了 Java 上下文中的 API 是什麼,了解了各種類型的 API,甚至實作了接受請求並處理請求的 API。雖然我們使用核心 Java 創建了最簡單的 REST API 形式,但有許多進階框架可以幫助我們輕鬆且安全地建立現代應用程式。
和往常一樣,範例的原始程式碼可以在 GitHub 上找到。