文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何使用Apache Camel表达REST服务

2023-07-02 08:41

关注

今天小编给大家分享一下如何使用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服务。

如果你打算将Camel与Spring Boot框架集成以暴露服务,最好使用servlet 组件,因为Spring Boot支持嵌入式Tomcat,Camel可以使用它。

让我们把REST配置成。

Java

// Define the implementing component - and accept the default host and portrestConfiguration()  .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的配置样本。

@Componentpublic class HttpRouteBuilder extends BaseRouteBuilder {@Overridepublic void configure() throws Exception {super.configure();// it tells Camel how to configure the REST servicerestConfiguration()// 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中最常见的是。

org.hibernate.validator.constraints ,有一些Hibernate特有的注释,比如。

如何处理异常

你可以处理不同类型的异常,并使用Apache Camel异常条款(onException )向客户端发送自定义的错误信息,无论是在路由级别还是在全球级别。你也可以重写REST API调用的HTTP响应代码和消息。

public class BaseRouteBuilder extends RouteBuilder {@Overridepublic void configure() throws Exception {onException(BeanValidationException.class).handled(true).process(new Processor() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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服务”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯