【问题标题】:How to implement media-type-versioning in NestJs?如何在 NestJs 中实现媒体类型版本控制?
【发布时间】:2021-09-08 20:25:32
【问题描述】:

使用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

【问题讨论】:

    标签: routes nestjs nestjs-swagger


    【解决方案1】:

    你可以试试这个:

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

    【讨论】:

    • 好吧,这个实现是可行的,但是当我们只有一个方法时,我们如何告诉 swagger (Open API) 我们为每个接受头返回什么类型?即使用哪个nestjs-swagger-decorators
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多