该功能仅支持 JSON 格式的输出,对MessagePack无效
起因:因在对接APP的时候我们一直在围绕着几个反复的问题在纠结:
-
新迁移的NetCore API 对原来的PageModel的字段变更不支持以前老的格式(当然事已至此已经无法再改回老的模型了)
-
在与APP对接的时候一直围绕DateTime的格式问题纠结,APP对于处理日期足够的麻烦。所以客户端一直要求需要时间戳。
故此在API脚手架新增加隐藏功能。
现在API可支持:
1、自定义输出字段
决模型不一致的问题,直接改善了客户端对接各种API导致模型不一致的问题,也可以按需索取,减少不需可解决模型不一致的问题,直接改善了客户端对接各种API导致模型不一致的问题,也可以按需索取,减少不需要的字段输出,避免加大网络的传输
2、对输出的字段重命名
在新老API切换过程中难免字段的命名变化,或者由于服务端的字段命名过长的问题导致增加网络传输压力等一些问题
3、自定义DateTime格式的输出
因为日期格式的问题,按照老的方式,可能需要额外创建其他格式的字段输出,造成没必要的开销。
那么怎么使用新功能
服务端接入
当然我们需要引用:
<PackageReference Include="XUCore.NetCore" Version="1.0.9" />
源码:MessagePack
然后需要在注册MessagePack的时候配置ContractResolver即可LimitPropsCamelCaseContractResolver
如下配置代码:
//注册API MessagePack输出格式。 输入JSON/MessagePack 输出 JSON/MessagePack/MessagePack-Jackson
.AddMessagePackFormatters(options =>
{
options.JsonSerializerSettings = new JsonSerializerSettings()
{
DateTimeZoneHandling = DateTimeZoneHandling.Local,
//自定义JSON输出
ContractResolver = new LimitPropsCamelCaseContractResolver()
};
//默认设置MessageagePack的日期序列化格式为时间戳,对外输出一致为时间戳的日期,不需要我们自己去序列化,自动操作。
//C#实体内仍旧保持DateTime。跨语言MessageagePack没有DateTime类型。
options.FormatterResolver = MessagePackSerializerResolver.UnixDateTimeFormatter;
options.Options = MessagePackSerializerResolver.UnixDateTimeOptions;
});
客户端接入
1、如何改变DateTime的格式?
我们需要在http请求的时候,在head里加入配置
head | value | 说明 |
---|---|---|
limit-date-unix | true or false | 当设置为true的时候 则是所有DateTime时间全部返回时间戳,当为false的时候不启用 |
limit-date-format | 日期格式化字符串 | 比如:yyyy-MM-dd'T'HH:mm:ss'Z' 返回的数据如:2021-01-06T10:03:38Z |
如下图:设置了limit-date-format后所有日期字段均返回指定格式的日期
如下图:设置了limit-date-unix为true则返回时间戳
注意: limit-date-unix的优先级要大于limit-date-format
2、如何重命名和指定输出需要的字段?
head | value | 说明 |
---|---|---|
limit-mode | contain or ignore | contain 的意思是指定输出字段, ignore 的意思是忽略指定字段 |
limit-field | 字段集合 | 指定要输出或要忽略的字段,以英文逗号分隔,如:column1,column2,column3 |
limit-field-rename | 要重命名的字段 | 字段以输出为准,比如:code=c,subCode=sub,bodyMessage=data,nickname=userNickName |
注意:当你使用重命名limit-field-rename字段后,指定输出的字段limit-field要以重命名后的字段名为准,大小写也请依照你重命名后的格式。
任何指定输出,均不影响原始定义的结构。
示例一
如下表设置:
设置 | 值 | 说明 |
---|---|---|
limit-mode | contain | 指定匹配输出模式 |
limit-field | code,subCode,bodyMessage,userId,userNickName,entName | 设置需要的字段集合,英文逗号分隔 |
如下图所示输出结果:
示例二
如下表设置:
设置 | 值 | 说明 |
---|---|---|
limit-mode | contain | 指定匹配输出模式 |
limit-field | code,sub,data,totalPages,totalRecords,pageDatas,createTime,nickName,entId,entName | 设置需要的字段集合,英文逗号分隔,并以重命名后的字段为准设置输出字段 |
limit-field-rename | subcode=sub,bodyMessage=data,items=pageDatas,userNickName=nickName | 重命名字段 |
如下图所示输出结果:
示例三
如下表设置:
设置 | 值 | 说明 |
---|---|---|
limit-mode | ignore | 指定忽略输出模式 |
limit-field | code,subCode,message,userId,userNickName,entName,productType,userHeadImg_48 | 设置要忽略的字段集合,英文逗号分隔 |
如下图所示输出结果:
示例四
如下表设置:
设置 | 值 | 说明 |
---|---|---|
limit-mode | ignore | 指定忽略输出模式 |
limit-field | code,subCode,message,userId,userNickName,entName,productType,userHeadImg_48 | 设置要忽略的字段集合,英文逗号分隔 |
limit-date-unix | true | 设置DateTime输出时间戳 |
Accept | application/bailun-json | 指定输出bailun-json格式的json字符串格式 |
如下图所示输出结果:
适用范围定义
在一定程度上使API接入变得稍微复杂了一点点,但是能优化网络传输,或许我们可以考虑牺牲一点复杂度,按需索取来优化传输问题。
客户端 | 适合程度 |
---|---|
移动端 | 非常适合 |
web端 | 适合 |
服务端 | 跨语言,在不同规范的情况下适合接入,能解决模型不一致的问题,k8s内走内网地址不需要考虑这个问题 |