日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

客户要求ASP.NET Core API返回特定格式,怎么办?

發布時間:2023/12/4 asp.net 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 客户要求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=json2PascalCase

代碼實現

首先,需要讓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返回特定格式,怎么办?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。