客户要求ASP.NET Core API返回特定格式,怎么办?(续)
前言
上次,我們用
客戶就要求API的返回值屬性名必須是PascalCase(如UserName),但是這些API需要同時提供給內部系統使用,默認都是CamelCase(如userName)。
其實,返回的都是JSON格式,只是寫入屬性名的大小寫不一樣。
那么,直接修改JSON格式化實現,應該也是可行的?!
問題
在ASP.NET Core 3.0或更高版本中,默認JSON格式化程序基于 System.Text.Json,可以配置Microsoft.AspNetCore.Mvc.JsonOptions.JsonSerializerOptions實現自定義功能。
比如,設置返回值屬性名是PascalCase格式:
public?void?ConfigureServices(IServiceCollection?services) {services.AddControllers().AddJsonOptions(options?=>?options.JsonSerializerOptions.PropertyNamingPolicy?=?null); }但是,這種只能實現固定設置,不能滿足不同請求返回不同格式的需求。
這時,我們可以利用Newtonsoft.Json實現更靈活的配置。
添加Newtonsoft.Json支持
引用nuget包Microsoft.AspNetCore.Mvc.NewtonsoftJson,并修改Startup.cs,代碼如下:
public?void?ConfigureServices(IServiceCollection?services) {...services.AddControllers().AddNewtonsoftJson(options?=>{options.SerializerSettings.ContractResolver?=?new?MyCustomContractResolver();}); }使用自定義類MyCustomContractResolver格式化JSON。
MyCustomContractResolver實現
MyCustomContractResolver實現代碼如下:
public?class?MyCustomContractResolver?:?DefaultContractResolver?{private?CamelCaseNamingStrategy?_camelCase?=?new?CamelCaseNamingStrategy();public?override?JsonContract?ResolveContract(Type?type){return?CreateContract(type);}protected?override?string?ResolvePropertyName(string?propertyName){if?(GetFormat()?==?"json2"){return?propertyName;}return?_camelCase.GetPropertyName(propertyName,?false);}private?string?GetFormat(){Microsoft.Extensions.Primitives.StringValues?headerValues;if?(AppContext.Current.Request.Headers.TryGetValue("x-format",?out?headerValues)){return?headerValues.FirstOrDefault();}return?"json";} }默認的ResolveContract緩存了指定類型的格式化設置,以加快運行速度,不能滿足不同請求對同一類型執行不同的格式化要求。因此,為演示方便,這里去掉了緩存,你也可以實現自定義緩存
GetFormat是判斷當前請求格式化方式的自定義方法。為演示方便,這里判斷的是x-format Header,你也可以改成其他方式,比如根據當前用戶憑證進行判斷
AppContext.Current是對當前請求的HttpContext的封裝
結論
最后,分別發送請求,運行效果如下圖:
使用x-format?Header
不使用x-format?Header
完全滿足了要求,只需要客戶在每個API請求加上x-format Header即可。
如果你覺得這篇文章對你有所啟發,請關注我的個人公眾號”My IO“,記住我!
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的客户要求ASP.NET Core API返回特定格式,怎么办?(续)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPF实现聚光灯效果
- 下一篇: 活久见啊,WPF工资已经这么高了!