ASP.NET Core プログラミング

【 ASP.NET Core】JSON+ファイルのPOSTリクエストにSwaggerUIを対応させる方法

ASP.NET Core(.NET 6)のWEB APIで、JSONとファイルを同時にPOSTリクエストするアクションを実装したときに、SwaggerUI上でそのPOSTアクションに対応させる方法を解説していきます。

asp.net core
ASP.NET Core

JSON+ファイルのPOSTリクエスト

JSONと同時にファイルをアップロードする場合、デフォルトではSwaggerUI上から正常にPOSTリクエストを送信することができません。

SwaggerUIのデフォルトではJSONのみ、もしくは、ファイルのみ、しかPOSTリクエストで送信することができないようになっています。

SwaggerUIカスタマイズ 実装方法

public class FileUploadOperationFilter : IOperationFilter
    {
        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {
            var fileParameter = context.MethodInfo.GetParameters()
                .FirstOrDefault(p => p.ParameterType == typeof(IFormFile));
            var modelParameter = context.MethodInfo.GetParameters()
                .FirstOrDefault(p => p.ParameterType != typeof(IFormFile));

            if (fileParameter == null)
            {
                // IFormFile が含まれない場合は何もしない
                return;
            }

            // ファイルアップロードフォームの定義を作成する
            var fileSchema = new OpenApiSchema
            {
                Type = "file",
                Properties =
                {
                    ["file"] = new OpenApiSchema
                    {
                        Description = "Select file",
                        Format = "binary",
                        Type = "file"
                    }
                }
            };

            // JSONフォームの定義を作成する
            OpenApiSchema modelSchema = null;
            if (modelParameter != null)
            {
                modelSchema = context.SchemaGenerator.GenerateSchema(modelParameter.ParameterType, context.SchemaRepository);
            }

            // リクエストボディの定義を作成する
            // ファイルのみ
            if (fileParameter != null && modelSchema == null)
            {
                operation.RequestBody = new OpenApiRequestBody
                {
                    Content =
                    {
                        ["multipart/form-data"] = new OpenApiMediaType
                        {
                            Schema = new OpenApiSchema
                            {
                                Type = "object",
                                Properties =
                                {
                                    [fileParameter.Name] = fileSchema
                                }
                            }
                        }
                    }
                };
            }

            // ファイル+JSON
            if (fileParameter != null && modelSchema != null)
            {
                operation.RequestBody = new OpenApiRequestBody
                {
                    Content =
                    {
                        ["multipart/form-data"] = new OpenApiMediaType
                        {
                            Schema = new OpenApiSchema
                            {
                                Type = "object",
                                Properties =
                                {
                                    [fileParameter.Name] = fileSchema,
                                    [modelParameter.Name] = modelSchema
                                }
                            }
                        }
                    }
                };
                return;
            }
        }
    }

おすすめ記事はコチラ

スマレジ テックファーム 1

スマレジ テックファーム で Webエンジニアとして勤めている tomoです。 今回は株式会社スマレジや私が所属している 「 スマレジ テックファーム 」についてPRしていきたいと思います。 スマレジ ...

2

FromBody 属性を使用して、 ASP.NET Core(.NET 6)のWebAPIでBodyパラメータのJSONを受け取る方法を解説します。 FromBody 属性 POSTやGETで呼び出さ ...

PC picture 3

ASP.NET Core(.NET 6)でCookie認証のタイムアウトを設定する方法を解説します。 Cookieの有効期限について Cookieには通常はタイムアウト(有効期限)を設定します。 基本 ...

4

ASP.NET Core(.NET 6)でクロスオリジンリクエスト ( CORS )を設定する方法を解説します。 簡単に クロスオリジンリクエスト ( CORS )とは何かについても少し解説したいと思 ...

-ASP.NET Core, プログラミング
-, ,