【解決方法】Swashbuckle UI – ヘッダー フィールドがリクエストに設定されていません

プログラミングQA


親愛なるコミュニティへ

リクエストの「Accept-Header」フィールドで定義できる形式で画像を返す Web API エンドポイントを作成しようとしています。 Swashbuckle NugGet パッケージ (Swashbuckle.AspNetCore、バージョン 6.5.0) を使用していますが、UI にパラメーターが正しく表示されます。 スワッシュバックル スクリーンショット.
そこにも見られるように、 カール パラメータ -H ‘accept: text/plain’ は間違っています。’image/jpeg’ にする必要があります。

openAPI 定義は、

C#
IOperationFilter

これは、特定のタイプの Action パラメーターを削除し、代わりに Header パラメーターを挿入します (以下のコードを参照)。

私は自分が間違っていることに接着剤がありません…

ヒント、アドバイス、そしておそらく解決策をありがとう!
アルネ

私が試したこと:

C#
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using PEAM.API.Model;
using Swashbuckle.AspNetCore.SwaggerGen;

namespace PEAM.API.Middleware.Filter.OpenAPI
{
    public sealed class EaImageFormatFilter
        : IOperationFilter
    {
        private const string PngMimeType = "image/png";
        private const string JpgMimeType = "image/jpeg";
        private const string BmpMimeType = "image/bmp";

        private const string OpenApiStringType = "string";
        private const string AcceptHeader = "Accept";

        private IList<IOpenApiAny> AcceptedImageTypes { get; }

        public EaImageFormatFilter()
        {
            AcceptedImageTypes = new List<IOpenApiAny>()
            {
                new OpenApiString(PngMimeType),
                new OpenApiString(JpgMimeType),
                new OpenApiString(BmpMimeType)
            };
        }
        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {
            var parameterType = typeof(EaImageFormat);
            var parameterToRemove = context.ApiDescription.ParameterDescriptions
                                        .Where(parameter => parameter.Type.Equals(parameterType))
                                        .Select(parameter => parameter.Name)
                                        .ToHashSet();

            if (parameterToRemove.Any())
            {
                //--- parameter that are NOT of type EaImageFormat
                var keepParameter = (OpenApiParameter p) => !parameterToRemove.Contains(p.Name);

                //--- remove all parameters of type EaImageFormat
                operation.Parameters = operation.Parameters
                                            .Where(keepParameter)
                                            .ToList();

                //--- add new parameter 'Accept' with location 'Header'
                var parameter = new OpenApiParameter
                {
                    In          = ParameterLocation.Header,
                    Name        = AcceptHeader,
                    Description = "Pass accepted image format, e.g.: image/png, image/jpeg",
                    Required    = false,
                    Schema      = new OpenApiSchema
                    {
                        Type    = OpenApiStringType,
                        Default = new OpenApiString(PngMimeType),
                        Enum    = AcceptedImageTypes
                    },
                };

                operation.Parameters.Add(parameter);
            }
        }
    }
}

コメント

タイトルとURLをコピーしました