客户要求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的封装

结论

最后,分别发送请求,运行效果如下图:

f71b6bf24c8f90a03d3249d18afdcc66.png

使用x-format Header

36c06ca8e57033f6cdb090660a1ed120.png

不使用x-format Header

完全满足了要求,只需要客户在每个API请求加上x-format Header即可。

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“,记住我!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网吧也用VDI?

升级360以后,挨个菜单都点了一遍,虽然没啥用处,清清垃圾,升级下软件,清理下启动项还是很不错滴。 清理启动项的时候就搞笑了,发现Citrix联机插件居然被360识别为网吧无盘工作站连接中心。ICA Client我想了好…

知乎超高赞:见识多的人,平时都在看些什么?

全世界只有3.14 % 的人关注了爆炸吧知识微信新功能总在悄咪咪更新,“拍一拍”一出,很多小伙伴都会收到各种群里面千奇百怪的“拍一拍”,到底都是谁在偷偷关注你?真正决定人与人之间的差距的,其实是我们对事物的见识与内…

究竟是什么可以比反射还快实现动态调用?| Source Generators版

前言最近在公众号上看到一篇文章《究竟是什么可以比反射还快实现动态调用?》,它使用的是Newbe.ObjectVisitor,基于C#表达式树访问一个普通class的所有属性和对应的值,可以拥有比直接使用反射快上10倍的性能。就这一需求来说&#…

只要懂得拒绝,哪会有什么狗血感情与莫名其妙的误会

1 就凭你?也想握朕的手?2 来,快站好~抱好娃!拍全家福啦!3 自我约束有利于家庭和谐,嗯!4 问题来了,你是夜灯党还是漆黑党?你点的每个赞,我都认真当成了喜欢

android笔记之在WebView中显示ProgressBar的两种方法

http://blog.csdn.net/liuzhidong123/article/details/6450334 本文基于Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名http://www.cnblogs.com/luminji(包含…

绝对不能错过!2009~2019 高中数学联赛11年真题解析

全世界只有3.14 % 的人关注了爆炸吧知识参加过高中数学联赛的同学都知道,全国高中数学联赛作为中国数学会及各省、市、自治区数学会的一项经常性工作,是属于较高等级的数学竞赛,其地位远高于各省自行组织的数学竞赛。为什么这个竞赛会这么特别…

在Win7中怎样打开摄像头?

在Win7中怎样打开摄像头?标题所说的问题在我装了win7后也遇到了,当时我也只会用等下我说的第一个方法打开摄像头,不过幸运的是我在前些天了解到了另外一个方法,那么现在我先讲下这个问题出现的原因吧:在Win7推出后就因…

活久见啊,WPF工资已经这么高了!

金九银十高薪季,WPF招聘大厂多高薪多,阿里影视、百度地图、华为小米、小鹏特斯拉、美的碧桂园等都在招WPF人才,薪资30w起步,真心太牛了!为何WPF上位机自动化能异军突起?其实就是站在了IOT物联网的风口&…

视图加载时自动执行铵钮事件

再学习一个方法,就是在ASP.NET MVC视图加载时,让jQuery自动执行一个铵钮事件。在控制器添加一个Action操作: 先在视图实现一个铵钮事件: 看看上面运行时的效果,当视图加载时,需要人为去点击铵钮&#xff0c…

硕博士的朋友圈都有哪些特点?

全世界只有3.14 % 的人关注了爆炸吧知识很多同学都会有这种感觉,读了硕士博士后,兴趣会突然间发生很大变化,发朋友圈也会不一样了。而真正决定人与人之间的差距的,其实是我们对事物的见识与内心的格局,见识的深浅决定人…

WPF 触屏事件后触发鼠标事件的问题及 DataGrid 误触问题

WPF 触屏事件后触发鼠标事件的问题及 DataGrid 误触问题目录一、触屏事件连带触发鼠标事件的问题二、DataGrid 误触问题及解决方法独立观察员 2021 年 10 月 10 日一、触屏事件连带触发鼠标事件的问题这个是 WPF 已知的问题,网络上也有一些讨论,但是没有…

听说,99%的数学家都算不出这道题

全世界只有3.14 % 的人关注了爆炸吧知识著名的数学家毕达哥拉斯曾说:“朋友是你灵魂的倩影,要像220与284一样亲密。”就因为不经意的一句话,引发了一场数群和数学家长达几千年的“斗争”,甚至到现在依然没有结束!无数个…

oracle账号区分大小写吗,实战Oracle 11g用户密码不区分大小写

连接到:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQL> show  parameter sec_case_sensitive_logonNAME TYPE VAL…

sql 多表多行模糊查询_从零开始学习SQL(五)多表查询

经过之前的学习,现在我们已经对查询有了一定的了解,但是我们目前的所有查询都只能找到在一张表中的数据,但如果我们需要寻找分布在多张表格中的数据时,这种之前的查询就做不到了,这时就需要引入一种新的查询方法&#…

最新.NET MAUI有什么惊喜?

点击蓝字关注我们.NET 6 RC1 现已发布啦,我们为 .NET 多平台应用程序 UI (MAUI) 引入了所有的新布局。这是性能和可靠性的重大变化。我们很高兴我们还增加了一些关于accessibility方面的基于新的SemanticService、字体缩放选项和对Xamarin.Forms 效果的兼容性的功能…

亲一下就搞定的事,绝不花钱解决!

1 好了,你表演吧,球不看了2 “你这个车,至少得100条小鱼干啊” 3 羡慕了4 还…还有这种操作?5 被秀了一脸哈哈哈6 没有什么是一个么么哒解决不了的!你点的每个赞,我都认真当成了喜欢

微软发布了Visual Studio 2022 RC版,并将在11月8日发布正式版

微软今天发布了Visual Studio 2022 最接近正式发布的RC版本,同时宣布在11月8日发布正式版,届时将在线上发布虚拟的发布活动,具体参见:https://devblogs.microsoft.com/visualstudio/join-us-november-8th-for-the-launch-of-visua…

arcgis oracle trace,ArcGIS应用Oracle Spatial特征分析

该文章并不是将Oracle Spatial与ST_Geometry做对比,关于两者的对比,可以参考:http://www.linuxidc.com/Linux/2011-10/45492.htm,这里从数据结构,到性能对比,都描述的很清楚。其实这篇文件就是说明一下在A…

SharePoint Timer Job

首先介绍一下什么是定时器作业,说的再多,也不如一张图说的清楚这两张图应该把我想说的已经表达清楚了,下一步介绍一下如何自定义Timer Job第一步:创建一个类(CustomTimerJob.cs)第二步:引用 usi…

这次使用一个最舒服的姿势插入HttpClient拦截器技能点

码甲哥继续在同程艺龙写一点大前端,今天我们来了解一下如何拦截axios请求/响应?这次我们举一反三,用一个最舒适的姿势插入这个技能点。本文阅读耗时5 minute,行文耗时5 Days。axios是一个基于 promise 的网络请求库,可…