雖然 ASP.NET Web API 內建支援 JSON 與 XML 兩種輸出格式,並依據瀏覽器端送出的 Accept 標頭自動決定回應的內容格式,不過有時候我們的確也需要讓程式來控制要回應哪種格式,本文將介紹如何讓 ASP.NET Web API 自訂回應結果格式 (XML 或 JSON),以方便透過其他方法來決定如何回應訊息格式。

我們先來看看 ASP.NET MVC 4 專案範本幫我們產生預設 API 裡的 Get() 方法,程式碼非常簡單:

  1. // GET api/values
  2. public IEnumerable<</span>string> Get()
  3. {
  4. return new string[] { "value1", "value2" };
  5. }

如果我們要自訂回應格式的話,那麼 API 的回傳型別必須改成 HttpResponseMessage 才行,並透過以下程式碼做到自訂切換回應格式的動作:

  1. // GET api/values
  2. public HttpResponseMessage Get(string output = null)
  3. {
  4. var data = new string[] { "value1", "value2" };
  5. var resp = new HttpResponseMessage(HttpStatusCode.OK);
  6. if (output == "xml")
  7. {
  8. resp.Content = new ObjectContent<string>(data, new XmlMediaTypeFormatter());
  9. }
  10. else
  11. {
  12. resp.Content = new ObjectContent<string>(data, new JsonMediaTypeFormatter());
  13. }
  14. return resp;
  15. }

這段程式碼我大概解釋一下:

  • 第 2 行:透過 ASP.NET MVC 的模型繫結機制取得 Query String 上的 output 參數
  • 第 6 行:建立 HttpResponseMessage 物件,並指定 HTTP 回傳狀態為 200 (OK)
  • 第 8 ~ 15 行:自訂回應內容的程式碼,我們要透過 ObjectContent 型別傳入一個泛型參數來建立內容物件,而這個泛型參數就是在修改之前 Get() 方法的回傳型別 IEnumerable<<font color="#0000ff">string>,傳入的第一個參數是要輸出的資料,第二個參數則是輸出格式,這時你就可以選擇輸出 XmlMediaTypeFormatter 還是 JsonMediaTypeFormatter 了。

if (output == "xml")
            {
                resp.Content = new StringContent(data.ToString(), System.Text.Encoding.GetEncoding("UTF-8"), "application/xml");   //XmlMediaTypeFormatter
            }
            else
            {
                resp.Content = new StringContent(data.ToString(), System.Text.Encoding.GetEncoding("UTF-8"), "application/json");   //JsonMediaTypeFormatter
            }

如果要對該 API 進行測試,可以輸入以下網址路徑:

  • /api/values?output=xml
  • /api/values?output=json
  • 参考:http://blog.sina.com.cn/s/blog_60ba16ed0102v290.html

ASP.NET Web API 如何通过程序控制返回xml还是json的更多相关文章

  1. ASP.NET Web API 通过参数控制返回类型(JSON|XML)

    一个很实用的技巧,可以在访问web api服务的时候指定返回数据的格式类型,比如 json 或者 xml. 因为 web api 默认返回的是XML格式,但是现在json 比较流行,同时网上也有其他的 ...

  2. 【ASP.NET Web API教程】6.3 内容协商

    本文是Web API系列教程的第6.3小节 6.3 Content Negotiation 6.3 内容协商 摘自:http://www.asp.net/web-api/overview/format ...

  3. ASP.NET Web API 入门大杂烩

    [前言] 本文是大杂烩,意思即是:到处Copy再加一点点思考而混在一起的文章,引用来源因为太多太杂故而省略,望原作者原谅. [概述] ASP.NET Web API随ASP.NET MVC 4一起发行 ...

  4. 【ASP.NET Web API教程】1.1 第一个ASP.NET Web API

    Your First ASP.NET Web API (C#)第一个ASP.NET Web API(C#) By Mike Wasson|January 21, 2012作者:Mike Wasson ...

  5. 第一个ASP.NET Web API (C#)程序

    本文翻自http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api 绝对手工制作,如有雷同,实属巧合. 转载请注明. ...

  6. 【Web API系列教程】1.1 — ASP.NET Web API入门

    前言 HTTP不仅仅服务于web页面.同一时候也是构建暴露服务和数据的API的强大平台.HTTP有着简单.灵活和无处不在的特点.你能想到的差点儿全部平台都包括有一个HTTP库.所以HTTP服务能够遍及 ...

  7. Getting Started with ASP.NET Web API 2 (C#)

    By Mike Wasson|last updated May 28, 2015 7556 of 8454 people found this helpful Print   Download Com ...

  8. ASP.NET Web API与Rest web api(一)

    HTTP is not just for serving up web pages. It is also a powerful platform for building APIs that exp ...

  9. ASP.NET Web API与Rest web api(一)

    本文档内容大部分来源于:http://www.cnblogs.com/madyina/p/3381256.html HTTP is not just for serving up web pages. ...

随机推荐

  1. sql之独立子查询和相关子查询总结

    1.独立子查询:顾名思义:就是子查询和外层查询不存在任何联系,是独立于外层查询的: 下面就看一个例子: 有一张订单表 Sales.Order 和一张 客户表 Sales.Customer 下面的sql ...

  2. Eclipse编辑jsp、js文件时,经常出现卡死现象解决汇总

    使用Eclipse编辑jsp.js文件时,经常出现卡死现象,在网上百度了N次,经过N次优化调整后,卡死现象逐步好转,具体那个方法起到作用,不太好讲.将所有用过的方法罗列如下: 1.取消验证 windo ...

  3. PAT-乙级-1009. 说反话 (20)

    1009. 说反话 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定一句英语,要求你编写程序,将句中 ...

  4. shuffle过程中的信息传递

    依据Spark1.4版 Spark中的shuffle大概是这么个过程:map端把map输出写成本地文件,reduce端去读取这些文件,然后执行reduce操作. 那么,问题来了: reducer是怎么 ...

  5. 成功解决Tomcat-JDBC-MySQL乱码

    0.MySQL-JDBC驱动文档 官方解释 1.数据库的字符编码和表内字段的编码 在MySQL中数据库的字符编码和表内字段的编码的要指定为utf8(utf8_general_ci) 2.jsp中 pa ...

  6. 【无聊放个模板系列】BZOJ 1597 斜率优化

    STL 双向队列DEQUE版本 #include<cstdio> #include<cstdlib> #include<cstring> #include<i ...

  7. PLS-00215:字符串长度限制在范围

    在Oracle中有一张people表 创建跟新表的存储过程 修改定义字段长度 总结:在Oracle中执行存储过程时,输出参数的长度要与原表中字段长度一致!

  8. (转)CSS+DIV float 定位

    来自:http://www.cnblogs.com/iyangyuan/archive/2013/03/27/2983813.html 很早以前就接触过CSS,但对于浮动始终非常迷惑,可能是自身理解能 ...

  9. matlab 中保存某几个变量

    save  AOA.mat dingjiao RMSE%保存变量dingjiao,RMSE于AOA.mat clear all;%当删除所有数据之后 load AOA.mat%还可以读出这两个变量的数 ...

  10. html元素elem.style.top.left始终为空

    有如下元素: <div id="div1"   >div1</div> #div1{ width:100px; height:100px; position ...