• Web APi入门之移除XML格式(一)


    前言

    回头想来,没想到自己却坚持下来了,EntityFramework系列终于全部完成了,给自己点个赞先。本系列将着手于Web API,关于一些基础的介绍及定义就不再叙述,请参考园友们文章,非常详细,我也是在此基础上步入学习的。

    简短介绍

    我们知道Web API是基于ASP.NET平台构建RESTful应用程序的框架(关于RESTful请参考园友Liam Wang关于其详细介绍),通过访问在方法标记为HttpPost、HttpGet、HttpPut等得知。

    问题探讨

    我们知道Web API默认输出的格式为JSON,但是当我们进行测试时大部分浏览器输出的都是XML格式,这种情况真是令人唏嘘不已。下面我们就以火狐为例,同时利用它的Fire Bug进行监控。我们利用测试数据,并进行访问如下:

    为何会出现如此情况呢?

    我们利用Fire Bug查看其报文头信息来进行分析,如下:

    因为Web API是根据检测请求头信息(Accept Header)来查找已经格式化注册的响应头信息(Content-Type)来确定它应该返回的输出类型。正是这种根据请求类型来响应相应类型的互动机制,使得Web API的功能变得强大,也就是说它能根据请求的透明来获得不同类型的输出。

    大部分浏览器发送的都是如下请求头信息:

    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

    Web API检测上述信息是从左到右并且同时尝试通过从格式化注册的列表中去找到一个匹配它的并且支持的介质类型(meta type)。在此种情况下,application/xml与Xml Formatter匹配上了,所以会以XML格式进行输出并返回。

    或许有些浏览器的可能请求信息为如下:

    Accept: text/html,application/xhtml+xml,*/*;q=0.9

    大部分浏览器中这样同样也是以XML格式打开,但是平时觉得在兼容方面非常恶心的IE 9模式下却是JSON,当然既然能以JSON打开肯定是没有包括application/xml了。

    或许有些浏览器的可能请求信息为如下:

    Accept: text/html, application/xhtml+xml, */*

    这更加不必多说了,这更加敏感的就暴露出要以XML格式输出了。

    根本上解决方案

    上述说了那么多都是以XML格式输出,如果在项目中需要大量的以JSON格式输出的数据的话,那么肯定会用到Web API了,我这才入门就是以这种方式回馈我,还能够好好的玩耍吗,看到园中大部分都是介绍大部分浏览器都是以XML格式输出的,但是却没给出一个解决方案,个人感觉有点欠妥,于是我就了解了下,通过上述我们知道请求过来的请求头信息是要和我们注册的格式进行匹配的并响应对应的格式,那么我们完全可以在匹配时做一点手脚将其请求过来的XML格式进行过滤不就ok了吗,此时就要用到我们Web API的配置文件 WebApiConfig 中的 Register 方法来进行过滤即可。

    虽然我们很难改变浏览器的请求头信息,但是我们可以改变服务器的头信息,如下:

               var formatters = config.Formatters.Where(formatter =>
                      formatter.SupportedMediaTypes.Where(media =>
                      media.MediaType.ToString() == "application/xml" || media.MediaType.ToString() == "text/html").Count() > 0) //找到请求头信息中的介质类型
                      .ToList();
    
                foreach (var match in formatters)
                {
                    config.Formatters.Remove(match);  //移除请求头信息中的XML格式
                }

    检验一下 ,输出成功:

    总结

    至此Web API算是入门吧,一步步来,不着急,有问题就解决,多花点时间也是值得的,你说呢!!!

  • 相关阅读:
    TS之类的继承
    TS之函数及函数传参
    TS之数据类型
    Linux 协程
    设计模式 装饰器模式和代理模式
    C/C++ C和C++的区别
    C/C++ 内存分配方式
    Linux 进程间通信
    C/C++ RTTI
    Reactor设计模式
  • 原文地址:https://www.cnblogs.com/CreateMyself/p/4811103.html
Copyright © 2020-2023  润新知