您好,登錄后才能下訂單哦!
今天小編給大家分享一下如何使用Apache Camel表達(dá)REST服務(wù)的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。
Camel REST允許使用Restlet、Servlet和許多這樣的HTTP感知組件來(lái)實(shí)現(xiàn)REST服務(wù)的創(chuàng)建。
大家都知道,Camel的主要功能是路由引擎。路由可以使用基于Java的DSL或基于XML來(lái)開(kāi)發(fā)。在這篇文章中,我將按照J(rèn)avaDSL來(lái)開(kāi)發(fā)一個(gè)REST服務(wù)。
為了定義端點(diǎn),我們需要使用Apache Camel DSL與 Java DSL(盡管你可以使用XML)。
下面是Java DSL。
Java
rest("/api/products") .get().route().to("...") .post().route().to("...") .delete().route().to("...");
它與Camel路由類似,但使用rest()
。我們需要提到用于暴露端點(diǎn)的組件服務(wù)。Camel支持以下組件來(lái)實(shí)現(xiàn)Bootstrap REST服務(wù)。
Servlet
Spark REST
Netty HTTP
Jetty
如果你打算將Camel與Spring Boot框架集成以暴露服務(wù),最好使用servlet
組件,因?yàn)镾pring Boot支持嵌入式Tomcat,Camel可以使用它。
讓我們把REST配置成。
Java
// Define the implementing component - and accept the default host and port restConfiguration() .component("servlet");
你可以用你選擇的任何其他端口號(hào)來(lái)覆蓋默認(rèn)的8080端口,方法是將.port()
設(shè)置為restConfiguration()
API,或者,如果你將Apache Camel與Spring Boot集成,你可以使用application.properties
中的server.port=8082
。
默認(rèn)情況下,Camel將導(dǎo)入請(qǐng)求映射到/camel/*
。你可以通過(guò)使用application.properties
作為camel.component.servlet.mapping.context-path=/services/api/*
,將其覆蓋到你選擇的任何特定路徑。
配置綁定模式,將請(qǐng)求集合到POJO對(duì)象。如果設(shè)置為 "off "以外的任何內(nèi)容,生產(chǎn)者將嘗試把傳入信息的主體從inType轉(zhuǎn)換為JSON或XML,而把響應(yīng)從JSON或XML轉(zhuǎn)換為outType。有五個(gè)枚舉,其值可以是以下之一:自動(dòng)、關(guān)閉、JSON、XML或json_xml。為了實(shí)現(xiàn)這一點(diǎn),你需要將綁定模式設(shè)置為restConfiguration()
,因?yàn)?code>bindingMode(RestBindingMode.auto); 。
請(qǐng)看下面的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驗(yàn)證器組件驗(yàn)證傳入的請(qǐng)求,這需要在您的Maven POM中添加camel-bean-validator
依賴關(guān)系。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-bean-validator</artifactId> </dependency>
為了實(shí)現(xiàn)輸入請(qǐng)求驗(yàn)證,你需要為POJO/請(qǐng)求類中的字段添加驗(yàn)證注解。這些注釋可在包javax.validation.constraints
。JSR-303 API中最常見(jiàn)的是。
@NotNull
- 檢查該字段是否是null
@AssertTrue
/@AssertFalse
- 檢查該字段是否為真或假
@Pattern(regex=, flags=)
- 檢查該字段是否與給定的 ,與給定的regex
flags
在org.hibernate.validator.constraints
,有一些Hibernate特有的注釋,比如。
@Email
- 檢查該字段是否包含一個(gè)有效的電子郵件地址
@CreditCardNumber
- 這個(gè)可能很明顯
@NotEmpty
- 檢查注解的字段是否為空或空。
你可以處理不同類型的異常,并使用Apache Camel異常條款(onException
)向客戶端發(fā)送自定義的錯(cuò)誤信息,無(wú)論是在路由級(jí)別還是在全球級(jí)別。你也可以重寫(xiě)REST API調(diào)用的HTTP響應(yīng)代碼和消息。
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() + "}"); } }); }
注意:在這里我創(chuàng)建了一個(gè)基類來(lái)處理各種異常,在我的主REST API構(gòu)建器類(HttpRouteBuilder
)中,它擴(kuò)展了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表達(dá)REST服務(wù)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。