溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2022-06-10 15:46:26 來源:億速云 閱讀:265 作者:iii 欄目:開發技術

今天小編給大家分享一下如何使用Apache Camel表達REST服務的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    使用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>

    以上就是“如何使用Apache Camel表達REST服務”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女