繁体   English   中英

如何使用Camel Rest DSL支持媒体类型版本控制

[英]How to support media type versioning using Camel Rest DSL

我正在寻找一种使用媒体类型版本控制来对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()

注意,我在“ consums” /“ produces”中指定了多种媒体类型。 但是,我仅限于“ type” /“ outType”中的单个类。

如果我尝试多行“ post('/')”行,则会收到“在rest-dsl中检测到重复动词”错误。 有没有一种方法可以将媒体类型绑定到POJO?

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

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

consumesproducestypeoutType type仅用于生成摇摇规格。 您可以在rest定义中的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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM