手动设置 operationId 以允许在 Swashbuckle 中使用相同动词的多个操作 [英] Manually set operationId to allow multiple operations with the same verb in Swashbuckle

查看:33
本文介绍了手动设置 operationId 以允许在 Swashbuckle 中使用相同动词的多个操作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要知道是否可以设置自定义 operationid 或命名约定,我的意思是我知道操作过滤器可以通过生成 operationId 的方式被覆盖

一切都很好,现在我遇到了另一个问题,示例类似于可能的情况:在同一个控制器上我有两个端点

  • 发布:/customer body: {email, location....}
  • 发布:/customer/search body:{a filter,whatever}

这个例子不是很正确(最后一篇文章应该是一个get)但仍然假设webapi不能被改变(用于分离的新控制器)对于这种特殊情况我将尝试找出一种方法来为每个生成 operationId diffrent以某种方式采取行动,但我的问题是:

<块引用>

是否可以以某种方式装饰类似于[JsonIgnore] 或使用 [Route("customer/delete")],明确说明 operationId.

解决方案

EDIT 此答案与 Swashbuckle 5.6 和 .NET Framework 相关.请阅读mwilson 的回答,了解 Swashbuckle 和 .NET Core

您可以为此使用 Swashbuckle 提供的 SwaggerOperationAttribute.

[SwaggerOperation("get")]公共 IEnumerable<联系人>得到(){....}[SwaggerOperation("getById")]公共 IEnumerable<联系人>获取(字符串 ID){...}

顺便说一下,您也可以使用该属性为您的操作添加标签和方案.查看源代码

I need to know if it's possible to set up custom operationid, or a naming convention, I mean I know that operation filter can be overwritten the way how operationId is generated

https://azure.microsoft.com/en-us/documentation/articles/app-service-api-dotnet-swashbuckle-customize/

using Swashbuckle.Swagger;
using System.Web.Http.Description;

namespace Something
{
    public class MultipleOperationsWithSameVerbFilter : IOperationFilter
    {
        public void Apply(
            Operation operation,
            SchemaRegistry schemaRegistry,
            ApiDescription apiDescription)
        {
            if (operation.parameters != null)
            {
                operation.operationId += "By";
                foreach (var parm in operation.parameters)
                {
                    operation.operationId += string.Format("{0}",parm.name);
                }
            }
        }
    }
}

in SwaggerConfig.cs

 c.OperationFilter<MultipleOperationsWithSameVerbFilter>();

Now this is helpful transforming swagger description, check bellow:

All good, now I endup with another problem, example similar with may cases: on same controller I have two endpoints

  • Post: /customer boddy: {email, location....}
  • Post: /customer/search boddy: {a filter, whatever}

The example is not quite correct (last post should be a get) but still le assume that webapi cannot be changed (new controller for separation) for this particular case I will try to figure out a way to generate operationId diffrent for each action somehow, but my question is this:

Is it possible to decorate somehow the controller actions similar with [JsonIgnore] or with [Route("customer/delete")], to be explicit about the operationId.

解决方案

EDIT This answer relates to Swashbuckle 5.6 and .NET Framework. Please read mwilson's answer for Swashbuckle and .NET Core

You can use the SwaggerOperationAttribute provided by Swashbuckle for that.

[SwaggerOperation("get")]
public IEnumerable<Contact> Get()
{
    ....
}

[SwaggerOperation("getById")]
public IEnumerable<Contact> Get(string id)
{
    ...
}

You can use that attribute to add tags and schemes to your operation as well by the way. Have a look at the source code

这篇关于手动设置 operationId 以允许在 Swashbuckle 中使用相同动词的多个操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆