Percy
Percy

Reputation: 3115

Swagger Swashbuckle not showing response object in swagger.json

swagger 2.0.

.netcore 2.1

swashbuckle as in the image.

enter image description here

I have this attribute on an api endpoint:

[SwaggerResponse(statusCode: 200, type: typeof(List<Cat>), description: "successful operation")]

When I run the API and navigate to https://localhost:44394/swagger/v1/swagger.json the json is there but the SwaggerResponse seems to be being ignored.

This is an example of what I receive:

"/api/data/cats": {
  "get": {
    "tags": [
      "CatApi"
    ],
    "operationId": "GetCatsById",
    "consumes": [],
    "produces": [],
    "parameters": [
      {
        "name": "catIds",
        "in": "query",
        "required": true,
        "type": "array",
        "items": {
          "type": "integer",
          "format": "int32"
        },
        "collectionFormat": "multi",
        "uniqueItems": false
      }
    ],
    "responses": {
      "200": {
        "description": "Success"
      }
    }
  }
},

You can see that the response just show a 200 and I'm not exactly sure where it's getting that description from - as you can see in the attribute it should be successful operation and my XML comment is <response code="200">successful operation</response>.

I'm very confused. How can I get Swashbuckle it use the SwaggerResponse attribute when it generates the json?

More info: If I use [ProducesResponseType(statusCode: 200, type: typeof(List<Cat>))] then I get what I want:

"/api/data/cats": {
  "get": {
    "tags": [
      "CatsApi"
    ],
    "operationId": "GetCatsById",
    "consumes": [],
    "produces": [
      "text/plain",
      "application/json",
      "text/json"
    ],
    "parameters": [
      {
        "name": "catIds",
        "in": "query",
        "required": true,
        "type": "array",
        "items": {
          "type": "integer",
          "format": "int32"
        },
        "collectionFormat": "multi",
        "uniqueItems": false
      }
    ],
    "responses": {
      "200": {
        "description": "Success",
        "schema": {
          "uniqueItems": false,
          "type": "array",
          "items": {
            "$ref": "#/definitions/Cat"
          }
        }
      }
    }
  }
},

You can see the additional data in the produces field and the schema in the responses field.

I could change to use ProducesResponseType everywhere but it isn't a standard field as far as Swagger is concerned - if I ever regenerate the code from the swagger file then I'll have to always make these changes so I'd like to get it working with SwaggerResponse.

Upvotes: 2

Views: 5337

Answers (2)

DerDingens
DerDingens

Reputation: 382

Also make sure you have the right using for the annotations. I searched and searched because the SwaggerResponse were missing and i couldn't get my head behind it.

I somehow managed to use Nswag Annotations, but needed Swashbucke using:

using Swashbuckle.AspNetCore.Annotations;

I think it came because as i didn't have a nuget for SwaggerResponse installed and the first suggestion for a nuget package that has this type was nswag.

Upvotes: 1

Transformer
Transformer

Reputation: 7429

Step 1: Double check if your are missing the Swagger Decorator Attributes, follow this below and replace the attributes with your specific Types / MyModel


Since you didn't put up your actual code, to see how it works, use the default samples for e.g. you can Install my Swashbuckle.Examples NuGet package. Decorate your methods with the new SwaggerResponseExample attributes below and you will see it work just fine!

// These attributes will help with your nested objects
[SwaggerResponse(HttpStatusCode.OK, Type=typeof(IEnumerable<Country>))]
[SwaggerResponseExample(HttpStatusCode.OK, typeof(CountryExamples))]
[SwaggerResponse(HttpStatusCode.BadRequest, Type = typeof(IEnumerable<ErrorResource>))]
public async Task<HttpResponseMessage> Get(string lang)

Ste 2: Also ensure you have it configured like so

configuration
    .EnableSwagger(c =>
    {
        c.OperationFilter<ExamplesOperationFilter>();
    })
    .EnableSwaggerUi();

Upvotes: 2

Related Questions