<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
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服務。
如果你打算將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!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45