yamamoWorks

.NET技術を中心に気まぐれに更新していきます

ASP.NET Core Web APIでSnake Caseに対応する - ApiExplorer編

おさらい

ASP.NET Core Web APIでSnake Caseに対応する - Body編 - yamamoWorks
ASP.NET Core Web APIでSnake Caseに対応する - Query編 - yamamoWorks

Body編、Query編でモデルクラスやアクションメソッドの引数を変えることなくレスポンスJsonやURLクエリパラメータを「snake_case」に適応させました。

ASP.NET Core Web APIでSnake Caseに対応する - Swagger編 - yamamoWorks

Swagger編ではSwashbuckleを使ったSwagger出力に「snake_case」を対応させました。 このSwagger編ではSwashbuckleのカスタマイズ機能を使って実現しましたが、ASP.NET Core Web APIには標準でAPI仕様をモデル化したMicrosoft.AspNetCore.Mvc.ApiExplorerが提供されているので、今回はこれにも対応できる方法を紹介します。(Swagger編を置き換える形)

名称
Upper Camel Case (Pascal Case) FirstName
Lower Camel Case firstName
Snake Case first_name
Screaming Snake Case FIRST_NAME
Kebab Case first-name
Train Case First-Name

IApiDescriptionProvider

ApiExplorerの仕組みでAPI仕様を司っているのがMicrosoft.AspNetCore.Mvc.ApiExplorer.IApiDescriptionProviderインターフェイスです。文字通りAPIの説明を提供してくれます。 その実装であるMicrosoft.AspNetCore.Mvc.ApiExplorer.DefaultApiDescriptionProviderが標準でServiceCollectionに登録されています。 今回はカスタムのApiDescriptionProviderを実装しDefaultApiDescriptionProviderと入れ替えることで「snake_case」に対応させます。

// ConfigureServices Method in Startup.cs
services.AddTransient<IApiDescriptionProvider, SnakeCaseApiDescriptionProvider>();
services.Remove(services.Single(s => s.ImplementationType == typeof(DefaultApiDescriptionProvider)));

これでSwashbuckleのカスタマイズ機能を使わなくても、標準のApiExplorerフレームワークに沿って「snake_case」対応ができました。