我在使用媒体类型版本控制对我的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中,基于所选的内容类型。
答案 0 :(得分:0)
consumes
,produces
,type
,outType
仅用于生成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()