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