使用Apache Camel表达REST服务的方法

目录
  • 使用Apache Camel的REST服务
    • 如何使用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>

总结

现在你知道了如何用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服务内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Apache Camel的Java编程入门指南

    Apache Camel是一个非常实用的规则引擎库,能够用来处理来自于不同源的事件和信息.你可以在使用不同的协议比如VM,HTTP,FTP,JMS甚至是文件系统中来传递消息,并且让你的操作逻辑和传递逻辑保持分离,这能够让你更专注于消息的内容. 在这篇文章中,我将提供一个Java语言(非Groovy)的Apache Camel入门演示. 首先创建一个Maven项目的pom.xml. <?xml version="1.0" encoding="UTF-8"?>

  • 使用Apache Camel表达REST服务的方法

    目录 使用Apache Camel的REST服务 如何使用Apache Camel来表达REST服务 定义端点 如何覆盖端口 覆盖上下文路径 在请求对象中定义验证规则 如何处理异常 总结 使用Apache Camel的REST服务 Apache Camel可以作为一个独立的或嵌入的库在任何地方运行,它可以帮助整合.继续阅读,了解如何使用它来暴露REST服务. 如何使用Apache Camel来表达REST服务 Camel REST允许使用Restlet.Servlet和许多这样的HTTP感知组件

  • Linux环境下Apache开启https服务的方法详解

    本文实例讲述了Linux环境下Apache开启https服务的方法.分享给大家供大家参考,具体如下: 首先申请SSL证书,以阿里云为例,找到域名管理: 免费开启SSL证书: 配置单域名免费证书:(有效期一年) 点击确定,验证证书: 审核成功后可以下载证书: 下载Apache的SSL证书: 解压出来这三个我放到了Apache安装目录/etc/httpd/cert下面 httpd.conf 里面加这个(引入conf.d文件夹下面的全部conf): Include conf.d/*.conf 运行这两

  • 如何在Linux操作系统下安装Apache服务的方法实例详解

    链接下载: 操作环境 VMware虚拟机中CentOS 7.6 SecureCRT Xftp(Xmanager) 需求分析 使用Apache服务实现访问http 操作步骤 1.挂载光盘 [root@localhost ~]# mount /dev/cdrom /mnt 查看是否挂载 [root@localhost ~]# df -Th 2.从源码包编译安装程序 (编译安装) [root@localhost Packages]# yum -y install gcc gcc-c++ make 3.

  • 使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务的方法(推荐)

    在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Apache的Http Client.Netty的异步HTTP Client, Spring的RestTemplate.但是,用起来最方便.最优雅的还是要属Feign了. Feign简介 Feign是一种声明式.模板化的HTTP客户端.在Spring Cloud中使用Feign, 我们可以做到使用HTT

  • 在VMware+centOS 8上基于http协议搭建Git服务的方法

    一.起因 一定要看 本文最终目的是实现Android终端访问虚拟机中git服务,所以需要搭建http协议的git服务器,而如何搭建http协议的git服务器,前人之述备矣,笔者遂借鉴前人之作这里 二.设备信息 windows10家庭中文版(1903) VMware 15Pro(15.5.0 build-14665864) centOS 8(1905已关闭GUI,VMware采用NAT模式) 三.准备工作 (一)windows防火墙开放80端口控制面板 -> 系统和安全 -> Windows D

  • Apache安装后出现服务无法启动(服务里启动出现错误代码1)

    目录 一.报错信息 二.错误原因 三.解决方法 一.报错信息 1.安装后显示安装成功,但是出现服务无法启动错误代码1 2.以管理员身份cmd,进入Apache24/bin目标下,执行httpd.exe 二.错误原因 显示错误代码1,这种代号就意味着,端口号被占用 在cmd里bin目录下执行代码httpd.exe为了让它显示出错误,看到被占用的端口号,从而解决问题 三.解决方法 1.在命令提示符里输入运行 netstat -ano 查看端口占用情况 进程编号(PID)为6812的进程将443端口占

  • 利用apache ftpserver搭建ftp服务器的方法步骤

    目录 操作环境: 一.usermanager采用文件形式管理xml示例如下 二.usermanager采用mysql数据库管理用户时,ftpd-mysql.xml示例如下 三.usermanager采用Sqlite数据库管理用户时,ftpd-sqlite.xml示例如下 四.解决ftpd.exe在64位windows系统启动失败的问题 五.python操作sqlite的ftp.db管理(增加删除)用户 操作环境: win2012r2 x64 datacenter Apache FtpServer

  • GO语言实现简单TCP服务的方法

    本文实例讲述了GO语言实现简单TCP服务的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import ( "net" "fmt" ) var (   maxRead = 1100     msgStop   = []byte("cmdStop")     msgStart  = []byte("cmdContinue")     ) func main() {       ho

  • AngularJS基于factory创建自定义服务的方法详解

    本文实例讲述了AngularJS基于factory创建自定义服务的方法.分享给大家供大家参考,具体如下: 为什么要创建自定义服务? 很简单,不想让控制器显得过于"臃肿",而且服务可复用.针对性强,每个服务对应不同的功能. 这里介绍如何使用factory创建自定义服务,并且使用他. 例子1: <!--HTML--> <div ng-controller="showTheName"> <h1 ng-bind="name"

随机推荐