弃用单个 Web API 方法上的多个路由中的特定路由

Posted

技术标签:

【中文标题】弃用单个 Web API 方法上的多个路由中的特定路由【英文标题】:Deprecate specific route out of multiple routes on single Web API method 【发布时间】:2018-07-13 09:20:17 【问题描述】:

您好,我有如下所示的 WEB API 实现。我们在单个方法上使用多个路由。

[SwaggerOperation("Update Records By Id")]
    [Route("/construction/field-record")]
    [Route("/construction/fieldRecord")]
    public async Task<IActionResult> UpdateRecord([FromBody] UpdateRecordRequest request)

两个问题,

    如何仅将两条路线中的一条标记为已弃用? 如何在 Swagger UI 上更新 swagger 以指示该路由已“弃用”?

-谢谢

【问题讨论】:

【参考方案1】:

作为一种解决方法,您可以这样做

[SwaggerOperation("Update Records By Id")]
[Route("/construction/field-record")]
public async Task<IActionResult> UpdateRecord([FromBody] UpdateRecordRequest request)

   // code


[SwaggerOperation("Update Records By Id (Deprecated. Use '/construction/field-record')")]
[Route("/construction/fieldRecord")]
[Obsolete("Deprecated. Use 'UpdateRecord'")]
public async Task<IActionResult> UpdateRecordDeprecated([FromBody] UpdateRecordRequest request)

    return UpdateRecord(request);

【讨论】:

还有其他方法吗?谢谢@jag【参考方案2】:

您可以添加一个 OperationFilter 来检查相对路径。该字符串包含路线的名称。只需指定 HttpPost/HttpGet-routes

[HttpPost("/construction/field-record")]
[HttpPost("/construction/fieldRecord")]

然后使用下面的操作过滤器

public class ExplicitObsoleteRoutes : IOperationFilter

    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    
        if (context.ApiDescription.RelativePath.EndsWith("fieldRecord"))
        
            operation.Deprecated = true;
        
    

【讨论】:

【参考方案3】:

您可以添加一个检查 OperationId 的 OperationFilter。这是具有一致格式的路由的字符串版本;参数呈现为“ByXXXX”,其中 XXXX 是路由中变量的名称。您可以检查此 OperationId 以了解要弃用的路线,例如在控制器中:

[HttpGet]
//Obsolete route
[Route("api/customerId/account/read/orderId")]
//Correct route
[Route("api/customerId/account/orderId/read")]

然后使用操作过滤器:

public class ExplictObsoleteRoutes : IOperationFilter

    public void Apply(Operation operation, OperationFilterContext context)
    
         if (operation.OperationId.EndsWith("ByOrderIdGet")"))
           
             operation.Deprecated = true;
         
    

【讨论】:

以上是关于弃用单个 Web API 方法上的多个路由中的特定路由的主要内容,如果未能解决你的问题,请参考以下文章

Web API系列教程2.2 — ASP.NET Web API中的路由和动作选择机制

匹配单个特定 url 的自定义路由

深度对象路由的 Web API 最佳实践

在 ASP.NET Web API 中使用多个 Get 方法进行路由

Web API过滤器

单个 Heroku 应用程序上的多个工作程序/Web 进程