Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Manually set operationId to allow multiple operations with the same verb in Swashbuckle

Tags:

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:

enter image description here

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.

like image 226
SilentTremor Avatar asked Sep 09 '16 13:09

SilentTremor


2 Answers

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

like image 101
venerik Avatar answered Sep 23 '22 16:09

venerik


For swashbuckle 5.0, you can use the Name attribute. You can set it to any string but I'm a fan of using nameof like this: nameof(ActualMethodName).

[HttpGet("{id:int}", Name = nameof(GetProductById))] public IActionResult GetProductById(int id) // operationId = "GetProductById"' 

or

[HttpGet("{id:int}", Name = "GetProductById")] public IActionResult GetProductById(int id) // operationId = "GetProductById"' 

There are a few other options listed here

like image 23
mwilson Avatar answered Sep 23 '22 16:09

mwilson