如何使用Camel Rest DSL

时间:2017-02-26 23:34:06

标签: rest apache-camel

我在使用媒体类型版本控制对我的REST API进行版本控制时,正在寻找使用Camel Rest DSL的解决方案。有关我要完成的任务的详细信息,请参阅https://www.narwhl.com/2015/03/the-ultimate-solution-to-versioning-rest-apis-content-negotiation/

例如,如果我有两个版本的Store对象(V1_0和V2_0)。

.post('/').description('Create a new store').type(Store_V1_0).outType(Store_V1_0)
    .consumes('application/x.canopy.store+json; version=1.0, application/x.canopy.store+json; version=2.0')
    .produces('application/x.canopy.store+json; version=1.0, application/x.canopy.store+json; version=2.0' )
    .param().name('body').type(body).description('The store to create').endParam()
    .route()
        .to('log:com.acme.api.store?level=INFO&showHeaders=true')
    .endRest()

请注意,我已在"消费" /"生成"中指定了多种媒体类型。但是,我只限于"类型" /" outType"中的单个班级。

如果我尝试多次"发布(' /')"我收到一个"在rest-dsl"中检测到的重复动词。错误。有没有办法将媒体类型绑定到POJO?

欢迎使用媒体类型处理有关如何处理REST API版本的任何建议。

编辑:我也在尝试为Swagger生成规范,并希望能够看到不同的"示例值"在Swagger UI中,基于所选的内容类型。

1 个答案:

答案 0 :(得分:0)

consumesproducestypeoutType仅用于生成swagger规范。您可以在其余定义中的route()指令之后接受/解组,处理和封送回您想要的任何格式:

类似的东西:

.post('/').description('Create a new store')
    .param().name('body').type(body).description('The store to create').endParam()
    .route()
        .to('log:com.acme.api.store?level=INFO&showHeaders=true')
        .choice()
          .when(header(Exchange.CONTENT_TYPE).isEqualTo("application/x.canopy.store+json; version=1.0"))
            .unmarshal(Store_V1_0)
            .process(v1Processor)
          .when(header(Exchange.CONTENT_TYPE).isEqualTo("application/x.canopy.store+json; version=1.2"))
            .unmarshal(Store_V2_0)
            .process(v2Processor)
        .end()
        .process(doSomethingElse)
        .marshal().json()
    .endRest()