客户要求ASP.NET Core API返回特定格式,怎么办?(续)
前言
上次,我們用
客戶就要求API的返回值屬性名必須是PascalCase(如UserName),但是這些API需要同時(shí)提供給內(nèi)部系統(tǒng)使用,默認(rèn)都是CamelCase(如userName)。
其實(shí),返回的都是JSON格式,只是寫入屬性名的大小寫不一樣。
那么,直接修改JSON格式化實(shí)現(xiàn),應(yīng)該也是可行的?!
問題
在ASP.NET Core 3.0或更高版本中,默認(rèn)JSON格式化程序基于 System.Text.Json,可以配置Microsoft.AspNetCore.Mvc.JsonOptions.JsonSerializerOptions實(shí)現(xiàn)自定義功能。
比如,設(shè)置返回值屬性名是PascalCase格式:
public?void?ConfigureServices(IServiceCollection?services) {services.AddControllers().AddJsonOptions(options?=>?options.JsonSerializerOptions.PropertyNamingPolicy?=?null); }但是,這種只能實(shí)現(xiàn)固定設(shè)置,不能滿足不同請(qǐng)求返回不同格式的需求。
這時(shí),我們可以利用Newtonsoft.Json實(shí)現(xiàn)更靈活的配置。
添加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實(shí)現(xiàn)
MyCustomContractResolver實(shí)現(xiàn)代碼如下:
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";} }默認(rèn)的ResolveContract緩存了指定類型的格式化設(shè)置,以加快運(yùn)行速度,不能滿足不同請(qǐng)求對(duì)同一類型執(zhí)行不同的格式化要求。因此,為演示方便,這里去掉了緩存,你也可以實(shí)現(xiàn)自定義緩存
GetFormat是判斷當(dāng)前請(qǐng)求格式化方式的自定義方法。為演示方便,這里判斷的是x-format Header,你也可以改成其他方式,比如根據(jù)當(dāng)前用戶憑證進(jìn)行判斷
AppContext.Current是對(duì)當(dāng)前請(qǐng)求的HttpContext的封裝
結(jié)論
最后,分別發(fā)送請(qǐng)求,運(yùn)行效果如下圖:
使用x-format?Header
不使用x-format?Header
完全滿足了要求,只需要客戶在每個(gè)API請(qǐng)求加上x-format Header即可。
如果你覺得這篇文章對(duì)你有所啟發(fā),請(qǐng)關(guān)注我的個(gè)人公眾號(hào)”My IO“,記住我!
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的客户要求ASP.NET Core API返回特定格式,怎么办?(续)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPF实现聚光灯效果
- 下一篇: 究竟是什么可以比反射还快实现动态调用?|