如何在 Quarkus 中使用 REST API
一、簡介
微服務架構透過將整體系統分解為更小的、鬆散耦合的服務,改變了我們設計和建立應用程式的方式。這些服務主要透過 REST API 相互通信,因此了解如何有效使用這些 API 至關重要。
Quarkus 是一個針對微服務最佳化的現代 Java 框架。
在本教程中,我們將探索如何在 Quarkus 中建立虛擬 REST API,並示範使用不同客戶端使用它的各種方法。這些知識對於建立健壯且高效的基於微服務的應用程式至關重要。
2. 建立API
首先,我們需要設定一個基本的 Quarkus 應用程式並建立一個傳回文章清單的虛擬 REST API。
2.1.建立貼文實體
我們將建立一個我們的 API 將傳回的Post
實體:
public class Post {
public Long id;
public String title;
public String description;
// getters, setters, constructors
}
2.2.建立貼文資源
此外,對於此範例,我們將建立一個資源,該資源將傳回 JSON 格式的貼文清單:
@Path("/posts")
public class PostResource {
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Post> getPosts() {
return Arrays.asList(
new Post(1L, "Post One", "This is the first post"),
new Post(2L, "Post Two", "This is the second post")
);
}
}
我們將在新應用程式中使用此 API。
2.3.測試 API
我們可以使用curl
測試我們的新API:
curl -X GET http://localhost:8080/posts
透過呼叫此函數,我們將獲得一個 JSON 帖子列表:
[
{
"id": 1,
"title": "Post One",
"description": "This is the first post"
},
{
"id": 2,
"title": "Post Two",
"description": "This is the second post"
}
]
現在,讓這個 API 發揮作用,我們將看到如何在另一個 Quarkus 應用程式中使用它而不是在curl
中。
3.透過Rest Client使用API
Quarkus 支援 MicroProfile Rest Client,這是一種功能強大且類型安全的 HTTP 用戶端,它透過提供介面驅動的方法來簡化 RESTful API 的使用。
3.1. Maven依賴
首先,我們需要在pom.xml
中包含Rest Client 依賴項:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client</artifactId>
<version>3.13.3</version>
</dependency>
這將提供與 MicroProfile Rest Client 配合使用所需的元件。
3.2.定義客戶端介面
我們將定義一個代表我們想要使用的遠端 API 的介面。此介面應反映 API 端點的結構:
@Path("/posts")
@RegisterRestClient(configKey = "post-api")
public interface PostRestClient {
@GET
@Produces(MediaType.APPLICATION_JSON)
List<Post> getAllPosts();
}
@RegisterRestClient
註解將此介面註冊為 REST 用戶端, configKey
屬性用於綁定配置屬性。 @Path
註解指定 API 的基本路徑。
3.3.配置
可以使用介面中定義的configKey
在application.properties
檔案中指定 REST 用戶端的基本 URL:
quarkus.rest-client.post-api.url=http://localhost:8080
透過這樣做,我們可以輕鬆修改 API 的基本 URL,而無需更改原始程式碼。除此之外,我們還可以更改應用程式的預設連接埠:
quarkus.http.port=9000
我們這樣做是因為第一個 API 在預設連接埠 8080 上運行。
3.4.使用 Rest 用戶端
一旦定義並配置了 Rest Client 接口,我們就可以使用@RestClient
註釋將其註入 Quarkus 服務或資源類別中。此註解告訴 Quarkus 提供使用基本 URL 和其他設定配置的指定介面的實例:
@Path("rest-client/consume-posts")
public class PostClientResource {
@Inject
@RestClient
PostRestClient postRestClient;
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Post> getPosts() {
return postRestClient.getAllPosts();
}
}
3.5.測試應用程式
現在,一切都設定完畢,我們可以測試我們的應用程式。我們可以透過運行curl
命令來做到這一點:
curl -X GET localhost:9000/rest-client/consume-posts
這應該返回我們的 JSON 帖子列表。
4. 透過 JAX-RS 客戶端 API 使用 API
JAX-RS 用戶端 API 是 Java API for RESTful Web Services (JAX-RS) 規格的一部分。它提供了一種標準的程式設計方式來建立 HTTP 請求和使用 RESTful Web 服務。
4.1. Maven依賴
首先,我們需要在 pom.xml 中包含RESTEasy Client依賴項:
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>6.2.10.Final</version>
</dependency>
這種依賴關係引入了RESTEasy
、Quarkus 使用的 JAX-RS 實作以及發出 HTTP 請求所需的客戶端 API。
4.2.實施 JAX-RS 客戶端
為了使用 REST API,我們將建立一個服務類別來設定 JAX-RS 用戶端、設定目標 URL 並處理回應:
@ApplicationScoped
public class JaxRsPostService {
private final Client client;
private final WebTarget target;
public JaxRsPostService() {
this.client = ClientBuilder.newClient();
this.target = client.target("http://localhost:8080/posts");
}
public List<Post> getPosts() {
return target
.request()
.get(new GenericType<List<Post>>() {});
}
}
我們使用建構器模式初始化客戶端,並使用 API 請求的基本 URL 設定目標。
4.3.透過資源類公開 API
現在,我們需要做的就是將我們的服務注入到我們的資源中:
@Path("jax-rs/consume-posts")
public class PostClientResource {
@Inject
JaxRsPostService jaxRsPostService;
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Post> getJaxRsPosts() {
return jaxRsPostService.getPosts();
}
}
4.4.測試應用程式
現在我們可以使用curl
再次測試我們的API:
curl -X GET localhost:9000/jax-rs/consume-posts
5. 使用 Java 11 HttpClient 使用 API
Java 11 引入了新的 HTTP 用戶端 API,它提供了一種現代、非同步且功能豐富的方式來處理 HTTP 通訊。 java.net.http.HttpClient
類別允許我們輕鬆發送 HTTP 請求並處理回應,在本節中,我們將學習如何執行此操作。
5.1.建立HttpClient
服務
本範例中不需要額外的依賴項,Java 11 的HttpClient
是標準函式庫的一部分。
現在,我們將建立一個管理HttpClient
的服務類別:
@ApplicationScoped
public class JavaHttpClientPostService {
private final HttpClient httpClient;
private final ObjectMapper objectMapper;
public JavaHttpClientPostService() {
this.httpClient = HttpClient.newHttpClient();
this.objectMapper = new ObjectMapper();
}
public List<Post> getPosts() {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://localhost:8080/posts"))
.GET()
.build();
try {
HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
return objectMapper.readValue(response.body(), new TypeReference<ArrayList<Post>>() { });
}
catch (IOException | InterruptedException e) {
throw new RuntimeException("Failed to fetch posts", e);
}
}
}
在此類中,我們初始化HttpClient
實例和 Jackson 中的ObjectMapper
實例,我們將使用它們將 JSON 回應解析為 Java 物件。
我們建立一個HttpRequest
對象,指定 API 端點的 URI 和 HTTP 方法。之後,我們使用HttpClient
實例的send()
方法發送請求。我們使用BodyHandlers.ofString()
處理回應,它將正文轉換為字串。我們將使用ObjectMapper
將該字串轉換為Post
物件。
5.2.創建資源
為了讓所取得的資料可以透過我們的應用程式使用,我們將透過資源類別公開JavaHttpClientPostService
:
@Path("/java-http-client/consume-posts")
public class JavaHttpClientPostResource {
@Inject
JavaHttpClientPostService postService;
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Post> getPosts() {
return postService.getPosts();
}
}
5.3.測試應用程式
現在我們可以使用curl
再次測試應用程式:
curl -X GET localhost:9000/java-http-client/consume-posts
六、結論
在本文中,我們示範如何使用 Quarkus RestClient、JAX-RS 用戶端 API 和 Java 11 HttpClient
在 Quarkus 中使用 REST API。
每種方法都有優點: RestClient
與 Quarkus 無縫集成,JAX-RS 用戶端 API 提供靈活性,Java 11 的HttpClient
帶來了 JDK 的現代功能。掌握這些技術可以實現微服務之間的有效通信,從而使在 Quarkus 中建立可擴展且高效的架構變得更加容易。
支援本文的程式碼 Baeldung Pro 會員可在 GitHub 上取得。以會員身分登入後,您將在此處看到項目代碼庫的連結。