今天小編給大家分享一下如何使用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>
以上就是“如何使用Apache Camel表達REST服務”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。