专栏首页小神仙abp部分接口转换为首字母大写返回

abp部分接口转换为首字母大写返回

在对接手机端app接口时,由于手机端需要返回的模型使用首字母大写的形式,abp(asp.net core)接口默认返回的数据是驼峰命名法,就是首字母小写,我们自己的pc网页端又是使用的驼峰法,所以不能直接改mvc的配置,这样pc端所有的接口都要改。有同学是用的给字段指定json序列化名称:

  [JsonProperty("Id")] public Guid Id { get; set; }

这样写不知道他累不累


解决

过程很曲折,不提也罢,直接说方案: 我们想要的效果是指定的接口(类型)使用指定的方式返回json格式。微软爸爸给我们提供了IOutputFormatter接口用来格式化返回结果,我们就用这个接口来实现

创建自定义的格式化器

    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代码

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默认的序列化

 [Abp.Web.Models.DontWrapResult]
public class XXXController
{

}

参考资料

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • asp.net core导出导入excel

    用户6362579
  • 为类型增加选择属性

    用户6362579
  • silverlight属性改变事件通知

    工作中遇到silverlight本身没有提供的某些属性改变事件,但又需要在属性改变时得到通知,Google搬运stack overflow,原地址

    用户6362579
  • Java 关于接口的那点事儿

    接口的应用 接口是一种能力 关键字:interface 语法:  public interface MyInterface{   public void ...

    房上的猫
  • [C#1] 11-接口

    接口与继承 CLR规定一个类型只能有一个基类型,这种继承成为单继承; 接口继承是指一个类型继承的是接口中的方法签名,而非方法实现,通常称为实现接口; 接口仅仅是...

    blackheart
  • [设计模式] 适配器模式 + 外观模式

    顾名思义, ProductV2API是新的API接口, ProductV1API为历史API接口,实现类 HisAPIAdaptee为历史API的实现类,即被适...

    架构探险之道
  • java接口

    接口中常量的修饰关键字:public,static,final(常量) 函数的修饰关键字:public,abstract 如果没有写全,系统在编译时会自动加上 ...

    用户3030674
  • 10.JAVA-接口、工厂模式、代理模式、详解

    接口属于一个特殊的类,这个类里面只能有抽象方法和全局常量 (该概念在JDK1.8之后被打破,在1.8后接口中还可以定义普通方法和静态方法,在后续章节会详讲)

    张诺谦
  • 设计模式六大原则(4):接口隔离原则

    定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。 问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类...

    Angel_Kitty
  • Spring之Aware接口介绍

      在Bean对象的生命周期的方法中有好几个接口是Aware接口的子接口,所以弄清楚Aware接口对于理解Spring框架还是很有帮助的。

    用户4919348

扫码关注云+社区

领取腾讯云代金券