zoukankan      html  css  js  c++  java
  • 美化WebApi,使其统一返回Json格式

    博客部分代码来自其他博主,暂时找不到你的博文连接,如果您觉得我的代码中引入了您的代码或者文章,可在下方把您的博客文章写在下面,谢谢!!!

    WebApi有两种返回数据格式,一种是XML,一种是Json,在WebAPI中,你可以选择你自己喜欢的返回数据格式,在这里,我基本都是返回的是Json,基本上,使用WebApi 的时候,我都设置的是返回Json,我们美化接口,乃知全局,都将以Json格式显示出来!

    这是 API 默认返回的XML格式,我们接下来美化一下!

     一:新建一个空的WebApi项目

    创建一个文件夹 ,我这里  我这里取名字为:InteFilter

    创建一个类  JsonContentNegotiator  ,继承  IContentNegotiator

    需要引入这三个命名空间

    1 using System.Net.Http;
    2 using System.Net.Http.Formatting;
    3 using System.Net.Http.Headers;
     1 namespace DemoApi.InteFilter
     2 {
     3     public class JsonContentNegotiator: IContentNegotiator
     4     {
     5         private readonly JsonMediaTypeFormatter _jsonFormatter;
     6         public JsonContentNegotiator(JsonMediaTypeFormatter formatter)
     7         {
     8             _jsonFormatter = formatter;
     9         }
    10         public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
    11         {
    12             // 对 JSON 数据使用混合大小写。驼峰式,但是是javascript 首字母小写形式.小驼峰命名法。
    13             //config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new  CamelCasePropertyNamesContractResolver();
    14             // 对 JSON 数据使用混合大小写。跟属性名同样的大小.输出
    15             _jsonFormatter.SerializerSettings.ContractResolver = new UnderlineSplitContractResolver(); //小写命名法。
    16             _jsonFormatter.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";//解决json时间带T的问题
    17             _jsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;//解决json格式化缩进问题
    18             _jsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;//解决json序列化时的循环引用问题
    19             var result = new ContentNegotiationResult(_jsonFormatter, new MediaTypeHeaderValue("application/json"));
    20             return result;
    21         }
    22     }
    23 
    24 }

    二  创建 UnderlineSplitContractResolver 类  继承 DefaultContractResolver  (需要引入 using Newtonsoft.Json.Serialization;)

     1 namespace DemoApi.InteFilter
     2 {
     3     public class UnderlineSplitContractResolver : DefaultContractResolver
     4     {
     5         protected override string ResolvePropertyName(string propertyName)
     6         {
     7             return CamelCaseToUnderlineSplit(propertyName);//下划线分割命名法
     8             //return propertyName.ToLower();//小写命名法
     9         }
    10 
    11         private string CamelCaseToUnderlineSplit(string name)
    12         {
    13             StringBuilder builder = new StringBuilder();
    14             for (int i = 0; i < name.Length; i++)
    15             {
    16                 var ch = name[i];
    17                 if (char.IsUpper(ch) && i > 0)
    18                 {
    19                     var prev = name[i - 1];
    20                     if (prev != '_')
    21                     {
    22                         if (char.IsUpper(prev))
    23                         {
    24                             if (i < name.Length - 1)
    25                             {
    26                                 var next = name[i + 1];
    27                                 if (char.IsLower(next))
    28                                 {
    29                                     builder.Append('_');
    30                                 }
    31                             }
    32                         }
    33                         else
    34                         {
    35                             builder.Append('_');
    36                         }
    37                     }
    38                 }
    39 
    40                 builder.Append(char.ToLower(ch));
    41             }
    42 
    43             return builder.ToString();
    44         }
    45 
    46 
    47     }
    48 }

    三  打开WebApiConfig

    引入 

    using System.Net.Http.Formatting;
       /// <summary>
        /// WebApi 网关配置 需要下载 cors 包  ,使可以跨域网站资源请求
        /// </summary> 
        public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
                #region [=>2、WebApi 返回JSON,推荐做法性能最高]
                config.Services.Replace(typeof(IContentNegotiator), new InteFilter.JsonContentNegotiator(new JsonMediaTypeFormatter()));
                #endregion
                // Web API 配置和服务
    
                config.MapHttpAttributeRoutes();
                // string url= "";
                var cors = new EnableCorsAttribute("*", "*", "*");
                config.EnableCors(cors);
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{action}/{id}",   
                       defaults: new { controller = "Home", action = "Index", id = RouteParameter.Optional }
                );
            }
        }

    结果:

     

    致敬开源者

  • 相关阅读:
    SQL Server数据库读写分离提高并发性
    静态方法与实例化方法区别
    消息队列MQ对比
    【Python】socket模块应用
    【Matplotlib】利用Python进行绘图
    【Git】简单使用
    【HTTPS】自签CA证书 && nginx配置https服务
    【HTTP】 认证和单点登录 【瞎写的…】
    【Linux】防火墙与CentOS中的iptables
    【Ansible】的python api
  • 原文地址:https://www.cnblogs.com/whatarey/p/11293963.html
Copyright © 2011-2022 走看看