雖然 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. NSString常用方法

    --实例化方法-------------- NSString *str = [[NSString alloc] init]; NSString *str = [[[NSString alloc] in ...

  2. bnuoj 20832 Calculating Yuan Fen(暴力模拟)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=20832 [题意]: 给你一串字符串,求一个ST(0<ST<=10000),对字符串中字符 ...

  3. GIS的数学基础

    在这里需要说明一点,任何领域的概念.技术都有其特定的适用范围,有其解决的问题,有其发展的历史,所以,抛开应用环境.范围来谈技术就像是没有根系的枝丫,枝丫再粗壮也只是一根木头而已. 那接下来我们来聊聊什 ...

  4. Eclipse升级到4.4.2后界面主题更改

    在win8.1电脑上一直很喜欢eclipse luna sr1a(4.4.1)版本的界面好像是软件自动设置的. 这几天更新到eclipse luna sr2(4.4.2)版本后发现界面大变,怎么也找不 ...

  5. Hibernate应用SQL查询返回实体类型

    Hibernate应用SQL查询返回实体类型 Hibernate使用SQL查询返回实体类型 以前,使用SQL查询,结果放在 RS 结果集中,还要去转换影射到Java类中.Hibernate中,可以自动 ...

  6. CQRS学习——Storage实现(EF+Code First+DynamicReponsitory)[其四]

    [这里是的实现,指的是针对各个数据访问框架的一个基础实现] 目标 定义仓储/QueryEntry的基本功能 实现仓储的基本功能,以利于复用 实现一些常用的功能 提供一些便利的功能 目标框架 博主使用的 ...

  7. ASP.NET遍历textbox文本框

    Asp.Net如何遍历所有TextBox控件并清空 asp.net 不能像window那样直接遍历this.Controls就可以了,因为: this.Controls只是包含了Page根一级的con ...

  8. JAVA面试题:String 堆内存和栈内存

    java把内存划分为两种:一种是栈(stack)内存,一种是堆(heap)内存 在函数中定义的一些基本类型的变量和对象的引用变量都在栈内存中分配,当在一段代码块定义一个变量时,java就在栈中为这个变 ...

  9. Android 获取JSP或ASP的sessionId(Cookie)

    如果使用的是httpClient: try { HttpResponse response = HttpUtil.httpClient.execute(new HttpGet(url)); Heade ...

  10. 【BZOJ 1185】 凸包+旋转卡壳

    Description [分析] 打计算几何真的可以哭出来... 跟那个求线段最远点差不多,这题弄三个东西转一转,一个表示左端最远点,一个表示右端最远点,一个表示上面最远点. 左右两边的最远点用点积判 ...