Можно ли установить тип содержимого ответа на основе HTTP-кода ответа в ASP.NET Core (Swashbucle)? - PullRequest
2 голосов
/ 30 октября 2019

В настоящее время я работаю над этим на ASP.NET Core 3.0, используя Swashbuckle.AspNetCore , но я хотел бы узнать, что такое Спецификация OpenAPI 3.0 на тот случай, если кто-то знает лучше.

В настоящее время я пытаюсь установить спецификацию с библиотекой Nuget, чтобы обычно возвращаемые значения были content-type: application/json, но в исключительных случаях content-type: application/problem+json. В ASP.NET Core 3.0 и Swashbuckle это не представляется возможным из коробки (или мне очень не хватало). Это верно? Если не из коробки, какой может быть способ сделать это систематически?

Возможно ли это в спецификации OpenAPI? Я склонен полагать, что это, вероятно, так, но пропустил это при попытке просмотреть спецификацию.

Вот изображение для автоматически сгенерированной документации и случая HTTP 400, я хотел бы показать только application/problem+json в качествевозвращаемое значение.

Swashbuckle generated UI

1 Ответ

2 голосов
/ 31 октября 2019

Это можно сделать с помощью фильтра IOperationFilter, который можно настроить следующим образом:

1.CustomResponseType:

using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System.Collections.Generic;    
public class CustomResponseType : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        if (operation.Responses.ContainsKey("400")) {
            operation.Responses.Clear();
        }
        var data = new OpenApiResponse
        {
            Description = "Bad Request",
            Content = new Dictionary<string, OpenApiMediaType>
            {
                ["application/problem+json"] = new OpenApiMediaType(),
            }
        };
        operation.Responses.Add("400", data);
    }
}

2.Startup.cs:

services.AddSwaggerGen(c =>
     {
          c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
          c.OperationFilter<CustomResponseType>();
     });

3.Результат:

enter image description here

...