首页 > 解决方案 > 如何在 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'
        };
      }

更新

找到一个相关的功能请求:#3569

标签: routesnestjsnestjs-swagger

解决方案


你可以试试这个:

  @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;
    }
  }

推荐阅读