客户要求ASP.NET Core API返回特定格式,怎么办?
當ASP.NET Core API提供給到外部系統使用時,在某些情況下,可能需要根據這些外部系統的要求來格式化數據。
比如,客戶就要求API的返回值屬性名必須是PascalCase(如UserName),但是這些API需要同時提供給內部系統使用,默認都是CamelCase(如userName)。
怎么辦?
雖然可以為外部系統重新做一套API,但是代價太大!能不能從自定義API的返回值上想辦法?
在微軟官方文檔上找到一篇設置 ASP.NET Core Web API 中響應數據的格式[1],介紹了響應格式 URL 映射。
使用FormatFilter可以根據請求路徑的路由映射將相應映射到相應的格式上。
希望達到的效果:
[ApiController] [Route("[controller]")] [FormatFilter] public?class?WeatherForecastController?:?ControllerBase {[HttpGet("{format?}")]public?IEnumerable<WeatherForecast>?Get()| WeatherForecast | 默認格式CamelCase |
| WeatherForecast?format=json2 | PascalCase |
代碼實現
首先,需要讓API支持自定義格式,返回MediaType還是application/json
public?void?ConfigureServices(IServiceCollection?services) {services.AddControllers(options?=>{options.FormatterMappings.SetMediaTypeMappingForFormat("json2",?MediaTypeHeaderValue.Parse("application/json"));}); }接著,我們需要替換掉默認的Json OutputFomatter:
for?(int?i?=?0;?i?<?options.OutputFormatters.Count;?i++) {if?(options.OutputFormatters[i]?is?Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonOutputFormatter?jsonOutputFormatter){options.OutputFormatters[i]?=?new?CustomJsonOutputFormatter(jsonOutputFormatter.SerializerOptions);break;} }?CustomJsonOutputFormatter的代碼如下:
public?class?CustomJsonOutputFormatter?:?SystemTextJsonOutputFormatter {private?readonly?SystemTextJsonOutputFormatter?pascalCaseFormater;public?CustomJsonOutputFormatter(JsonSerializerOptions?jsonSerializerOptions)?:?base(jsonSerializerOptions){var?newOptions?=?new?JsonSerializerOptions(jsonSerializerOptions);newOptions.PropertyNamingPolicy?=?null;pascalCaseFormater?=?new?SystemTextJsonOutputFormatter(newOptions);}public?override?Task?WriteAsync(OutputFormatterWriteContext?context){if?(GetFormat(context)?==?"json2"){return?pascalCaseFormater.WriteAsync(context);}return?base.WriteAsync(context);}private?string??GetFormat(OutputFormatterWriteContext?context){if?(context.HttpContext.Request.RouteValues.TryGetValue("format",?out?var?obj)){var?routeValue?=?Convert.ToString(obj,?CultureInfo.InvariantCulture);return?string.IsNullOrEmpty(routeValue)???null?:?routeValue;}var?query?=?context.HttpContext.Request.Query["format"];if?(query.Count?>?0){return?query.ToString();}return?"json";} }如果format是json2,就用pascalCaseFormater處理,否則使用默認處理。
小插曲: 需要設置pascalCaseFormater的JsonSerializerOptions.PropertyNamingPolicy屬性,指定用于將對象的屬性名稱轉換為其他格式(例如PascalCase)的策略,本來還準備實現一個PascalCasePolicy。但是轉念一想,C#本身的Property名不就是PascalCase的嗎?!直接將PropertyNamingPolicy設為null不處理就行了。
結論
最后,運行結果如下:?
完全滿足了要求,只需要客戶在每個API請求URL上加上?format=json2即可。
如果你覺得這篇文章對你有所啟發,請關注我的個人公眾號”My IO“,記住我!
參考資料
[1]
設置 ASP.NET Core Web API 中響應數據的格式: https://docs.microsoft.com/zh-cn/aspnet/core/web-api/advanced/formatting?view=aspnetcore-5.0
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的客户要求ASP.NET Core API返回特定格式,怎么办?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自定义EventSource(二)Pol
- 下一篇: 社区 正式发布了跨平台的 CoreWCF