如何在 Camel 中傳送 POST 請求
1. 概述
Apache Camel 是一個強大的開源整合框架。它提供了一組成熟的元件來與各種協定和系統(包括 HTTP)進行互動。
在本教程中,我們將探索 Apache Camel HTTP 元件,並示範如何向JSONPlaceholder (一個用於測試和原型設計的免費假 API)發起 POST 請求。
2. Apache Camel HTTP組件
Apache Camel HTTP 元件提供與外部 Web 伺服器通訊的功能。它支援各種HTTP方法,包括GET、POST、PUT、DELETE等。
預設情況下, HTTP 元件對 HTTP 使用連接埠 80,對 HTTPS 使用連接埠 443 。以下是 HTTP 元件 URI 的一般語法:
http://hostname[:port][/resourceUri][?options]
此元件必須以「 http
」或「 https
」方案開頭,後面接著主機名稱、選用連接埠、資源路徑和查詢參數。
我們可以使用 URI 中的httpMethod
選項來設定 HTTP 方法:
https://jsonplaceholder.typicode.com/posts?httpMethod=POST
另外,我們可以在訊息頭中設定HTTP方法:
setHeader(Exchange.HTTP_METHOD, constant("POST"))
設定 HTTP 方法對於成功發起請求至關重要。
3. 項目設定
首先,我們將[camel-core](https://mvnrepository.com/artifact/org.apache.camel/camel-core)
和camel-test-jnit5
依賴項加入pom.xml
:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-core</artifactId>
<version>4.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-test-junit5</artifactId>
<version>4.6.0</version>
</dependency>
camel-core
依賴項提供了系統整合的核心類別。重要的類別之一是用於建立路線的RouteBuilder
。 camel-test-junit5
提供使用 JUnit 5 測試 Camel 路由的支援。
接下來,讓我們將camel-jackson
和camel-http
依賴項加入pom.xml
中:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jackson</artifactId>
<version>4.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-http</artifactId>
<version>4.6.0</version>
</dependency>
camel-http
依賴項為 HTTP 元件提供與外部伺服器通訊的支援。此外,我們還使用 Jackson 新增了camel-jackson
相依性以進行 JSON 序列化和反序列化。
然後,我們為「 https://jsonplaceholder.typicode.com/post
」的 POST 請求建立一個範例 JSON 負載:
{
"userId": 1,
"title": "Java 21",
"body": "Virtual Thread",
}
這裡,有效負載包含userId, title,
和body
。我們希望端點在成功建立新貼文後返回 HTTP 狀態碼 201。
4. 發送Post請求
首先,我們建立一個名為PostRequestRoute
類別,它擴充了RouteBuilder
類別:
public class PostRequestRoute extends RouteBuilder {
}
RouteBuilder
類別讓我們可以重寫configure()
方法來建立路由。
4.1.使用 JSON 字串發送 Post 請求
讓我們定義一個向虛擬伺服器發送 POST 請求的路由:
from("direct:post").process(exchange -> exchange.getIn()
.setBody("{\"title\":\"Java 21\",\"body\":\"Virtual Thread\",\"userId\":\"1\"}"))
.setHeader(Exchange.CONTENT_TYPE, constant("application/json"))
.to("https://jsonplaceholder.typicode.com/posts?httpMethod=POST")
.to("mock:post");
在這裡,我們定義一個路由並將有效負載設定為 JSON 字串。 setBody()
body 方法接受 JSON 字串作為參數。此外,我們使用httpMethod
選項將 HTTP 方法設定為 POST。
然後,我們將請求傳送到 JSONPlacehoder API。最後,我們將回應轉發到模擬端點。
4.2.使用 POJO 類別發送 Post 請求
但是,定義 JSON 字串可能容易出錯。為了獲得更類型安全的方法,我們定義一個名為Post:
public class Post {
private int userId;
private String title;
private String body;
// standard constructor, getters, setters
}
接下來,讓我們修改路由以使用 POJO 類別:
from("direct:start").process(exchange -> exchange.getIn()
.setBody(new Post(1, "Java 21", "Virtual Thread"))).marshal().json(JsonLibrary.Jackson)
.setHeader(Exchange.HTTP_METHOD, constant("POST"))
.setHeader(Exchange.CONTENT_TYPE, constant("application/json"))
.to("https://jsonplaceholder.typicode.com/posts")
.process(exchange -> log.info("The HTTP response code is: {}", exchange.getIn().getHeader(Exchange.HTTP_RESPONSE_CODE)))
.process(exchange -> log.info("The response body is: {}", exchange.getIn().getBody(String.class)))
.to("mock:result");
在這裡,我們從名為start
直接端點開始。然後,我們建立一個Post
實例並將其設定為請求正文。此外,我們使用 Jackson 將 POJO 編組為 JSON 。
接下來,我們將請求傳送到假 API 並記錄回應代碼和正文。最後,我們將回應轉發到模擬端點以進行測試。
5. 測試路由
讓我們寫一個測試來驗證我們的路由行為。首先,讓我們建立一個擴展CamelTestSupport
類別的測試類別:
class PostRequestRouteUnitTest extends CamelTestSupport {
}
然後,讓我們建立一個模擬端點和生產者範本:
@EndpointInject("mock:result")
protected MockEndpoint resultEndpoint;
@Produce("direct:start")
protected ProducerTemplate template;
接下來,讓我們重寫createRouteBuilder()
方法以使用PostRequesteRoute
:
@Override
protected RouteBuilder createRouteBuilder() {
return new PostRequestRoute();
}
最後我們來寫一個測試方法:
@Test
void whenMakingAPostRequestToDummyServer_thenAscertainTheMockEndpointReceiveOneMessage() throws Exception {
resultEndpoint.expectedMessageCount(1);
resultEndpoint.message(0).header(Exchange.HTTP_RESPONSE_CODE)
.isEqualTo(201);
resultEndpoint.message(0).body()
.isNotNull();
template.sendBody(new Post(1, "Java 21", "Virtual Thread"));
resultEndpoint.assertIsSatisfied();
}
在上面的程式碼中,我們定義了對模擬端點的期望,並使用template.sendBody()
方法發送請求。最後,我們確定滿足了模擬端點設定的期望。
六,結論
在本文中,我們學習如何使用 Apache Camel 向外部伺服器發出 POST 請求。我們首先定義使用 JSON 字串和 POJO 發送 POST 請求的路由。
此外,我們也了解如何使用 HTTP 元件與外部 API 進行通訊。最後,我們編寫了一個單元測試來驗證我們的路由行為。
與往常一樣,範例的完整原始程式碼可在 GitHub 上取得。