首頁 > 軟體

使用Apache Camel表達REST服務的方法

2022-06-10 18:00:59

使用Apache Camel的REST服務

Apache Camel可以作為一個獨立的或嵌入的庫在任何地方執行,它可以幫助整合。繼續閱讀,瞭解如何使用它來暴露REST服務。

如何使用Apache Camel來表達REST服務

Camel REST允許使用Restlet、Servlet和許多這樣的HTTP感知元件來實現REST服務的建立。

大家都知道,Camel的主要功能是路由引擎。路由可以使用基於Java的DSL或基於XML來開發。在這篇文章中,我將按照JavaDSL來開發一個REST服務。

定義端點

為了定義端點,我們需要使用Apache Camel DSL與 Java DSL(儘管你可以使用XML)。

下面是Java DSL。

Java

rest("/api/products")
     .get().route().to("...")
     .post().route().to("...")
     .delete().route().to("...");

它與Camel路由類似,但使用rest() 。我們需要提到用於暴露端點的元件服務。Camel支援以下元件來實現Bootstrap REST服務。

  • Servlet
  • Spark REST
  • Netty HTTP
  • Jetty

如果你打算將Camel與Spring Boot框架整合以暴露服務,最好使用servlet 元件,因為Spring Boot支援嵌入式Tomcat,Camel可以使用它。

讓我們把REST設定成。

Java

// Define the implementing component - and accept the default host and port
restConfiguration()
  .component("servlet");

如何覆蓋埠

你可以用你選擇的任何其他埠號來覆蓋預設的8080埠,方法是將.port() 設定為restConfiguration() API,或者,如果你將Apache Camel與Spring Boot整合,你可以使用application.properties 中的server.port=8082

覆蓋上下文路徑

預設情況下,Camel將匯入請求對映到/camel/* 。你可以通過使用application.properties 作為camel.component.servlet.mapping.context-path=/services/api/*,將其覆蓋到你選擇的任何特定路徑。

設定繫結模式,將請求集合到POJO物件。如果設定為 "off "以外的任何內容,生產者將嘗試把傳入資訊的主體從inType轉換為JSON或XML,而把響應從JSON或XML轉換為outType。有五個列舉,其值可以是以下之一:自動、關閉、JSON、XML或json_xml。為了實現這一點,你需要將繫結模式設定為restConfiguration() ,因為bindingMode(RestBindingMode.auto);

請看下面的REST API的設定樣本。

@Component
public class HttpRouteBuilder extends BaseRouteBuilder {
	@Override
	public void configure() throws Exception {
		super.configure();
		// it tells Camel how to configure the REST service
		restConfiguration()
				// Use the 'servlet' component.
				// This tells Camel to create and use a Servlet to 'host' the RESTful API.
				// Since we're using Spring Boot, the default servlet container is Tomcat.
				.component("servlet")
				// Allow Camel to try to marshal/unmarshal between Java objects and JSON
				.bindingMode(RestBindingMode.auto);

		rest().get("/kyc/{uid}").route().process("httpRequestProcessor").to("log:?level=INFO&showBody=true").endRest();

		rest().post("/kyc").type(RequestObject.class).route().to("bean-validator:myvalidatorname")
				.process("httpRequestProcessor").to("log:?level=INFO&showBody=true");
	}
}

您可以使用Apache Camel bean驗證器元件驗證傳入的請求,這需要在您的Maven POM中新增camel-bean-validator 依賴關係。

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-bean-validator</artifactId>
</dependency>

在請求物件中定義驗證規則

為了實現輸入請求驗證,你需要為POJO/請求類中的欄位新增驗證註解。這些註釋可在包javax.validation.constraints 。JSR-303 API中最常見的是。

  • @NotNull - 檢查該欄位是否是null
  • @AssertTrue/@AssertFalse - 檢查該欄位是否為真或假
  • @Pattern(regex=, flags=) - 檢查該欄位是否與給定的 ,與給定的regex flags

org.hibernate.validator.constraints ,有一些Hibernate特有的註釋,比如。

  • @Email - 檢查該欄位是否包含一個有效的電子郵件地址
  • @CreditCardNumber - 這個可能很明顯
  • @NotEmpty - 檢查註解的欄位是否為空或空。

如何處理異常

你可以處理不同型別的異常,並使用Apache Camel異常條款(onException )向用戶端傳送自定義的錯誤資訊,無論是在路由級別還是在全球級別。你也可以重寫REST API呼叫的HTTP響應程式碼和訊息。

public class BaseRouteBuilder extends RouteBuilder {
	@Override
	public void configure() throws Exception {
		onException(BeanValidationException.class).handled(true).process(new Processor() {
			@Override
			public void process(Exchange exchange) throws Exception {
				Throwable cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Throwable.class);
				exchange.getMessage().setHeader(Exchange.HTTP_RESPONSE_CODE, 400);
				exchange.getMessage().setHeader(Exchange.CONTENT_TYPE, MediaType.APPLICATION_JSON);
				exchange.getMessage().setBody("{error:" + cause.getMessage() + "}");
			}
		});
		onException(InvalidRequestException.class).handled(true).process(new Processor() {
			@Override
			public void process(Exchange exchange) throws Exception {
				Throwable cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Throwable.class);
				exchange.getMessage().setHeader(Exchange.HTTP_RESPONSE_CODE, 400);
				exchange.getMessage().setHeader(Exchange.CONTENT_TYPE, MediaType.APPLICATION_JSON);
				exchange.getMessage().setBody("{error:" + cause.getMessage() + "}");
			}
		});
		onException(Exception.class).handled(true).process(new Processor() {
			@Override
			public void process(Exchange exchange) throws Exception {
				Throwable cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Throwable.class);
				exchange.getMessage().setHeader(Exchange.HTTP_RESPONSE_CODE, 500);
				exchange.getMessage().setHeader(Exchange.CONTENT_TYPE, MediaType.APPLICATION_JSON);
				exchange.getMessage().setBody("{error:" + cause.getMessage() + "}");
			}
		});
}

注意:在這裡我建立了一個基礎類別來處理各種異常,在我的主REST API構建器類(HttpRouteBuilder)中,它擴充套件了BaseRouteBuilder

最後是POM。

<dependencyManagement>
		<dependencies>
			<!-- Spring Boot BOM -->
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>${spring-boot.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<!-- Camel BOM -->
			<dependency>
				<groupId>org.apache.camel.springboot</groupId>
				<artifactId>camel-spring-boot-dependencies</artifactId>
				<version>${camel.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<dependency>
				<groupId>org.projectlombok</groupId>
				<artifactId>lombok</artifactId>
				<version>1.18.20</version>
				<scope>provided</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
			<exclusions>
				<exclusion>
					<groupId>com.fasterxml.jackson.datatype</groupId>
					<artifactId>jackson-datatype-jsr310</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.fasterxml.jackson.core</groupId>
					<artifactId>jackson-annotations</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<exclusions>
				<exclusion>
					<groupId>com.fasterxml.jackson.datatype</groupId>
					<artifactId>jackson-datatype-jsr310</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.apache.camel.springboot</groupId>
			<artifactId>camel-spring-boot-starter</artifactId>

		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.camel.springboot</groupId>
			<artifactId>camel-jackson-starter</artifactId>
			<exclusions>
				<exclusion>
					<groupId>com.fasterxml.jackson.core</groupId>
					<artifactId>jackson-annotations</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.apache.camel.springboot</groupId>
			<artifactId>camel-servlet-starter</artifactId>
		</dependency>
		<!-- Testing Dependencies -->
		<dependency>
			<groupId>org.apache.camel</groupId>
			<artifactId>camel-test-spring</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>com.vaadin.external.google</groupId>
					<artifactId>android-json</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.apache.camel</groupId>
			<artifactId>camel-swagger-java</artifactId>

		</dependency>
		<dependency>
			<groupId>org.apache.camel</groupId>
			<artifactId>camel-bean-validator</artifactId>
		</dependency>
	</dependencies>

總結

現在你知道了如何用Camel暴露REST API,你可能想知道什麼時候/為什麼要用Apache Camel來構建REST服務。簡單的答案是,如果你已經在使用Apache Camel來整合不同協定和應用程式之間的資料,那麼REST是你需要支援的另一個資料來源,而不是用Spring Boot或任何其他框架來構建REST服務。你可以利用Camel REST元件來暴露REST API,並使用已知的Camel DSL來消費/生產訊息,這有助於你規範技術樁。你還可以擴充套件Camel REST,使其包括Swagger,以便使用camel-swagger 元件提供API規範。

到此這篇關於使用Apache Camel表達REST服務的方法的文章就介紹到這了,更多相關Apache Camel的REST服務內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com