客户要求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,一经查实,立即删除!

相关文章

打造自己博客(wordpress)的wap手机版本

这儿介绍我试用的两款插件:wordpress-mobile-edition和wp-t-wap。1.先说一下两者的区别。 wordpress-mobile-edition插件使用后,可以用手机直接访问你的博客主域名,手机会自动调整成wap版本。我的诺基亚6730上测试,自带的浏览器可…

猴子偷桃php代码,C++实现猴子吃桃的示例代码

题目详情有一天,某只猴子摘了一些桃子,当时吃了一半,又不过瘾,于是就多吃了一个。以后每天如此,到第n天想吃时,发现就只剩下一个桃子。输入n,表示到第n天剩下1个桃子,请计算第一天猴…

网吧也用VDI?

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

socket python json_python实现的基于TCP的JSON数据通信

用Python写的一个多线程TCP通信实例,实现了JSON数据的传输。闲言少述,直接上代码​一、client#!/usr/bin/env python# -*- coding:utf-8 -*-#import socketimport threadingimport SocketServerimport jsondef client(ip, port, message):sock socket.s…

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

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

django 1.3下关于静态文件staticfiles的设置

Django 1.3版本发布有些日子了,在站点被屏蔽的这段时间里学习也处于荒废状态,因此到今天才真正接触到新版下Static文件的处理设置,希望不算太晚。更改设置涉及的文件:settings.py1import os.path2HERE_PATHos.path.dirname(__file…

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

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

ofbiz中的数据模型

DelegatorDelegator是整个ofbiz中数据库访问的入口,具体实现是GenericDelegator类,在这个类中通过protected ModelReader modelReader null;protected ModelGroupReader modelGroupReader null;这两个属性变量去查找在xml文件中定义的数据模型ModelRea…

oracle 大页配置,【Oracle】Oracle如何开启大页

前言:在Linux中配置hugepage可以提高oracle的性能,减少oracle sga的页交换,类似于aix中的lagepage。为什么 使用大页?LINUX内存的默认块大小是4K如果SGA为:128Gselect 128* 1024* 1024/4 from dual;33554432个块(三千多…

python关联分析sklearn_Python3利用pandas,sklearn进行关联度分析以及预测的demo

做个简单的demo记录下,防止忘记先看原始数据:一共有5列:日期,金钱,性别,工作年限,年龄。我们的目的是要分析各个维度对金钱的影响。关联度分析代码:# -*- coding: utf-8 -*-from numpy import a…

NLB+Cluster(一)

这也算是个群集系列版吧!首先在前面大家已经看到了利用openfiler建立仲裁磁盘,然后通过Linux开源软件openfiler与windows群集的结合一文看到了windows cluster群集上如何构建文件共享及DHCP服务。那么本次我们将要升级到一个较高的层次,来看一…

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

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

JS设置文本框只能是数字和小数点。

核心提示&#xff1a;JS判断只能是数字和小数点 只能输入字母和汉字 只能输入字母和汉字 JS判断只能是数字和小数点 1.文本框只能输入数字代码(小数点也不能输入) <input οnkeyup"this.valuethis.value.replace(/\D/g,)" onafterpaste"this.valuethis.value…

如何使用 Linq 获取每个分组中的第一个元素?

咨询区 Arian&#xff1a;考虑下面的记录:Id F1 F2 F3 -------------------------------------------------1 Nima 1990 102 Nima 1990 113 Nima 2000 …

oracle unpivot 空值,sql – 处理UNPIVOT中的NULL值

这很难看,但不依赖于必须找到NULL的带外替换&#xff1a;declare pivot_task table(age int null,[a] numeric(8,2),[b] numeric(8,2),[c] numeric(8,2),[d] numeric(8,2),[e] numeric(8,2));insert into pivot_task values (18, 0.5, null, 0.6, 1.21, 1.52),(19, 7.51, 6.51,…

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

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

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

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

在Win7中怎样打开摄像头?

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

python gdb coredump_Linux段错误及GDB Coredump调试方法

最近在Linux环境下做C语言项目&#xff0c;由于是在一个原有项目基础之上进行二次开发&#xff0c;而且项目工程庞大复杂&#xff0c;出现了不少问题&#xff0c;其中遇到最多、花费时间最长的问题就是著名的“段错误”(Segmentation Fault)。借此机会系统学习了一下&#xff0…

目标行动实现

最进看了本书。感觉有几个词&#xff0c;挺好的。愿景 执行 价值。做事要先看要不要做。在做&#xff0c;做完有价值。这是个朴实的道理。要实际践行啊。复杂的事情简单做&#xff0c;简单的事情重复做。这样好了。天人和1&#xff0c;转载于:https://www.cnblogs.com/wcLT/arc…