在对接手机端app接口时,由于手机端需要返回的模型使用首字母大写的形式,abp(asp.net core)接口默认返回的数据是驼峰命名法,就是首字母小写,我们自己的pc网页端又是使用的驼峰法,所以不能直接改mvc的配置,这样pc端所有的接口都要改。有同学是用的给字段指定json序列化名称:
1
[JsonProperty("Id")] public Guid Id { get; set; }
这样写不知道他累不累
解决
过程很曲折,不提也罢,直接说方案: 我们想要的效果是指定的接口(类型)使用指定的方式返回json格式。微软爸爸给我们提供了IOutputFormatter接口用来格式化返回结果,我们就用这个接口来实现
创建自定义的格式化器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class JsonFormatter : JsonOutputFormatter
{
public const string FormatterName = "PacalJson";
public JsonFormatter(JsonSerializerSettings serializerSettings, ArrayPool<char> charPool) : base(serializerSettings, charPool)
{
serializerSettings.ContractResolver = new DefaultContractResolver();
}
protected override bool CanWriteType(Type type)
{
//我的接口有两种返回包装类型XXX和XXX2,所以我直接根据返回类型判断了,拿到了类型,还可以通过特性判断,根据需要自己调整,如果你调试发现type是Abp.Web.Models.AjaxResponse类型,这是因为abp提前进行序列化了,在controller上添加特性[Abp.Web.Models.DontWrapResult],不使用abp默认的序列化
if (type != null && type.IsGenericType
&& (typeof(XXX<>).IsAssignableFrom(type.GetGenericTypeDefinition())
|| typeof(XXX2<>).IsAssignableFrom(type.GetGenericTypeDefinition())))
{
return true;
}
return false;
}
}
修改Startup文件的ConfigureServices方法中的AddMvc代码
1
2
3
4
5
6
7
8
9
10
11
12
13
services.AddMvc(
options =>
{
options.Filters.Add(new CorsAuthorizationFilterFactory(_defaultCorsPolicyName));
var JsonSerializerSettings = new Newtonsoft.Json.JsonSerializerSettings
{
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore,
ContractResolver = new DefaultContractResolver()
};
var jsonOutputFormatter = new JsonFormatter(JsonSerializerSettings, ArrayPool<char>.Shared);
options.OutputFormatters.Insert(0, jsonOutputFormatter);
}
);
在controller上添加特性,不使用abp默认的序列化
1
2
3
4
5
[Abp.Web.Models.DontWrapResult]
public class XXXController
{
}
参考资料
本文会经常更新,请阅读原文: https://dashenxian.github.io/post/abp%E9%83%A8%E5%88%86%E6%8E%A5%E5%8F%A3%E8%BD%AC%E6%8D%A2%E4%B8%BA%E9%A6%96%E5%AD%97%E6%AF%8D%E5%A4%A7%E5%86%99%E8%BF%94%E5%9B%9E ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 小神仙 (包含链接: https://dashenxian.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (125880321@qq.com) 。