routes - 如何在 NestJs 中实现媒体类型版本控制?
问题描述
使用media-type-versioning时,端点的不同版本应该具有相同的 URL,并且客户端可以将Accept
标头设置为所需的版本:例如
Accept: application/vnd.adventure-works.v1+json
对于版本 2:
Accept: application/vnd.adventure-works.v2+json
控制器的伪代码:
@Controller('orders')
export class OrdersController {
@Get('orders/:id')
getOrdersV1(@Headers('Accept') acceptHeader: string) {
// accept header must be 'application/vnd.adventure-works.v1+json'
return {
orderId: 1,
orderName: 'Order 1'
};
}
@Get('orders/:id')
getOrdersV2(@Headers('Accept') acceptHeader: string) {
// accept header must be 'application/vnd.adventure-works.v2+json'
return {
orderId: 1,
name: 'Order 1'
};
}
- 我们如何在 NestJs 中实现这一点?
即我需要以某种方式告诉 NestJs 路由器,只有在接受标头具有固定值时才应调用端点对应函数: - 这可以与nestjs-swagger一起使用吗?
更新
找到一个相关的功能请求:#3569
解决方案
你可以试试这个:
@Get('orders/:id')
getOrders(@Headers('Accept') acceptHeader: string) {
//Implement a manager class say OrderManager
OrderManager orderManager = new OrderManager(); // Better to @Inject in constructor
switch(acceptHeader) {
case ''application/vnd.adventure-works.v1+json'':
return orderManager.getOrdersV1();
case ''application/vnd.adventure-works.v2+json'':
return orderManager.getOrdersV2();
default:
// throw new InvalidInputException() if needed
break;
}
}
推荐阅读
- protractor - 如何在滚动时测试在表中加载更多行?
- liquibase - 将 Liquibase 集成到您的 gitlab-ci 管道中的最佳方法是什么?
- mysql - Docker:在停止的容器中编辑“my.cnf”文件
- node.js - 无法获取某些电子邮件的 Internet 邮件标头
- cmd - MSDeploy -setParam 选项将连接字符串中的 `"""` 替换为`"""`
- javascript - 如何使用 jsreport 和 jsreport Chrome Pdf 渲染 1k pdf 文件?
- python - 如何通过引用 numpy 数组的坐标来处理奇怪的索引行为?
- angular - LoaderController Ionic 4 从组件或页面中隐藏
- java - SurfaceTexture Android Camera2
- scala - Spark Dataframes:将条件列添加到数据框