zoukankan      html  css  js  c++  java
  • 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
    {
    
    }
    

    参考资料

  • 相关阅读:
    5.2 i++
    5.1 赋值语句
    Implement Queue using Stacks
    Binary Tree Paths
    Single Number III
    Ugly Number
    SurfaceHolder.Callback
    intellj(idea) 编译项目时在warnings 页签框里 报 “xxx包不存在” 或 “找不到符号” 或 “未结束的字符串字面值” 或 “需要)” 或 “需要;”等错误提示
    Hibernate添加日志--log4j
    java实现网页验证码
  • 原文地址:https://www.cnblogs.com/missile/p/12103878.html
Copyright © 2011-2022 走看看