在 API 參數中使用列舉可以避免我們需要記憶相對比較沒有意義的數字,例如下面的 Controller 就是使用 IceLevel 列舉作為參數傳遞冰塊的分量:
但是可以發現在 Swashbuckle.AspNetCore 6.2.3 所產生的 Swagger UI 中參數是以數字的方式出現
實際測試呼叫所提供的選單也是同樣的是數字,而不是我們想要的使用列舉的名稱
一開始以為是不支援使用列舉的名稱傳遞,但實際測試後發現可以成功接收
解決方式為在 Program.cs 中加入下面的程式碼:
註:筆者在測試時對 Web API 專案有效的是 Microsoft.AspNetCore.Mvc.JsonOptions ,而對 MVC 專案有效的是 Microsoft.AspNetCore.Mvc.JsonOptions,筆者並未進行深入的測試,暫時將兩者皆放上,若有更好的建議歡迎補充
重新啟動後就會發現出現列舉的名稱
測試時也能夠正常呼叫
[ApiController]
[Route("[controller]")]
public class RuyutController : ControllerBase
{
public enum IceLevel
{
None, // 去冰
Little, // 微冰
Less, // 少冰
Normal, // 正常冰
More, // 多冰
}
[HttpGet]
public IActionResult Get(IceLevel iceLevel)
{
return Ok(iceLevel);
}
}
但是可以發現在 Swashbuckle.AspNetCore 6.2.3 所產生的 Swagger UI 中參數是以數字的方式出現
實際測試呼叫所提供的選單也是同樣的是數字,而不是我們想要的使用列舉的名稱
一開始以為是不支援使用列舉的名稱傳遞,但實際測試後發現可以成功接收
https://localhost:7185/Ruyut?iceLevel=More
解決方式為在 Program.cs 中加入下面的程式碼:
builder.Services.Configure<Microsoft.AspNetCore.Http.Json.JsonOptions>(options =>
{
options.SerializerOptions.Converters.Add(new System.Text.Json.Serialization.JsonStringEnumConverter());
});
builder.Services.Configure<Microsoft.AspNetCore.Mvc.JsonOptions>(options =>
{
options.JsonSerializerOptions.Converters.Add(new System.Text.Json.Serialization.JsonStringEnumConverter());
});
註:筆者在測試時對 Web API 專案有效的是 Microsoft.AspNetCore.Mvc.JsonOptions ,而對 MVC 專案有效的是 Microsoft.AspNetCore.Mvc.JsonOptions,筆者並未進行深入的測試,暫時將兩者皆放上,若有更好的建議歡迎補充
重新啟動後就會發現出現列舉的名稱
測試時也能夠正常呼叫
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com