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


Posted in Servers onJune 10, 2022

使用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服务的方法的文章就介绍到这了!


Tags in this post...

Servers 相关文章推荐
nginx前后端同域名配置的方法实现
Mar 31 Servers
apache基于端口创建虚拟主机的示例
Apr 22 Servers
Nginx location 和 proxy_pass路径配置问题小结
Sep 04 Servers
NGINX 权限控制文件预览和下载的实现原理
Jan 18 Servers
关于Nginx中虚拟主机的一些冷门知识小结
Mar 03 Servers
阿里云国际版 使用Nginx作为HTTPS转发代理服务器
May 11 Servers
CentOS7环境下MySQL8常用命令小结
Jun 10 Servers
使用Apache Camel表达REST服务的方法
Jun 10 Servers
nginx之内存池的实现
Jun 28 Servers
教你nginx跳转配置的四种方式
Jul 07 Servers
ubuntu端向日葵键盘输入卡顿问题及解决
Dec 24 Servers
nginx sticky实现基于cookie负载均衡示例详解
Dec 24 Servers
CentOS7环境下MySQL8常用命令小结
Jun 10 #Servers
CentOS7安装MySQL8的超级详细教程(无坑!)
ubuntu下常用apt命令介绍
Jun 05 #Servers
netty 实现tomcat的示例代码
Jun 05 #Servers
基于docker安装zabbix的详细教程
Jun 05 #Servers
linux目录管理方法介绍
Jun 01 #Servers
Linux磁盘管理方法介绍
Jun 01 #Servers
You might like
PHP 和 XML: 使用expat函数(三)
2006/10/09 PHP
用PHP实现将GB编码转换为UTF8
2006/11/25 PHP
php adodb连接不同数据库
2009/03/19 PHP
PHP面向对象程序设计组合模式与装饰模式详解
2016/12/02 PHP
thinkPHP框架可添加js事件的分页类customPage.class.php完整实例
2017/03/16 PHP
使用PHP+MySql实现微信投票功能实例代码
2017/09/29 PHP
判断脚本加载是否完成的方法
2009/05/26 Javascript
JavaScript判断访问的来源是手机还是电脑,用的哪种浏览器
2013/12/12 Javascript
IE下通过a实现location.href 获取referer的值
2014/09/04 Javascript
jquery实现简单的轮换出现效果实例
2015/07/23 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
2015/08/13 Javascript
JavaScript构建自己的对象示例
2016/11/29 Javascript
JS简单获取当前年月日星期的方法示例
2017/02/07 Javascript
angular+ionic返回上一页并刷新页面
2017/08/08 Javascript
Angular 4中如何显示内容的CSS样式示例代码
2017/11/06 Javascript
Taro集成Redux快速上手的方法示例
2018/06/21 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
2019/05/26 Javascript
es6中使用map简化复杂条件判断操作实例详解
2020/02/19 Javascript
分享8个JavaScript库可更好地处理本地存储
2020/10/12 Javascript
Python+django实现简单的文件上传
2016/08/17 Python
Django配置celery(非djcelery)执行异步任务和定时任务
2018/07/16 Python
django+echart绘制曲线图的方法示例
2018/11/26 Python
使用TensorFlow实现二分类的方法示例
2019/02/05 Python
Python使用pymongo库操作MongoDB数据库的方法实例
2019/02/22 Python
Python 简单计算要求形状面积的实例
2020/01/18 Python
django的模型类管理器——数据库操作的封装详解
2020/04/01 Python
keras slice layer 层实现方式
2020/06/11 Python
新百伦折扣店:Joe’s New Balance Outlet
2016/08/20 全球购物
英国女士和男士时尚服装网上购物:Top Labels Online
2018/03/25 全球购物
导师对论文的学术评语
2015/01/04 职场文书
第28个世界无烟日活动总结
2015/02/10 职场文书
张思德观后感
2015/06/09 职场文书
傲慢与偏见读书笔记
2015/06/29 职场文书
2015中秋节晚会开场白
2015/07/30 职场文书
预备党员表决心的话
2015/09/22 职场文书
Pycharm远程调试和MySQL数据库授权问题
2022/03/18 MySQL