yamamoWorks

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

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

ApiExplorer編でSwagger対応が完成したかと思いましたが、パラメータのDescriptionが抜けている状態でした。

/// <summary>
/// ユーザ情報取得
/// </summary>
/// <param name="userId">ユーザID</param>
/// <param name="hideAge">年齢非表示</param>
/// <returns></returns>
[HttpGet("{userId}")]
public ActionResult<User> Get(string userId, bool hideAge)
{
    return Ok(new User { UserId = userId, Age = hideAge ? -1 : 40, FirstName = "Taro", LastName = "Yamada" });
}

f:id:yamamoWorks:20190509022216p:plain

Swashbuckleのソースコードを追ってみるとXmlCommentsOperationFilterクラスの中で、XMLドキュメントからXPATHで/doc/members/member[@name=メソッド名]/param[@name=パラメータ名]を取得してパラメータのDescriptionに当てているようです。
XMLドキュメント内のパラメータ名はソースコードと同じ「userId」ですが、既に「snake_case」になっているパラメータ「user_id」とマッチする処理がOpenApiParameter.Name /*userId*/ == (ParameterDescriptor.BindingInfo?.BinderModelName ?? ParameterDescriptor.Name /*user_id*/ )のようになっているのでBindingInfo.BinderModelNameに「snake_case」なパラメータ名をセットしておけば良さそうです。

SnakeCaseApiDescriptionProvider 38行目を追加

これでパラメータのDescriptionに反映されるようになりました。 f:id:yamamoWorks:20190509024355p:plain