天天看點

C#進階系列——WebApi 接口傳回值不困惑:傳回值類型詳解一、void無傳回值 二、IHttpActionResult三、HttpResponseMessage 四、自定義類型五、總結 

WebApi系列文章

<a href="http://www.cnblogs.com/landeanfen/p/5210356.html">C#進階系列——WebApi接口測試工具:WebApiTestClient</a>

<a href="http://www.cnblogs.com/landeanfen/p/5177176.html">C#進階系列——WebApi 跨域問題解決方案:CORS</a>

<a href="http://www.cnblogs.com/landeanfen/p/5287064.html">C#進階系列——WebApi身份認證解決方案:Basic基礎認證</a>

<a href="http://www.cnblogs.com/landeanfen/p/5337072.html">C#進階系列——WebApi接口傳參不再困惑:傳參詳解</a>

<a href="http://www.cnblogs.com/landeanfen/p/5501487.html">C#進階系列——WebApi接口傳回值不困惑:傳回值類型詳解</a>

<a href="http://www.cnblogs.com/landeanfen/p/5363846.html" target="_blank">C#進階系列——WebApi異常處了解決方案</a>

C#進階系列——WebApi區域Area使用小結

使用過Webapi的園友應該都知道,Webapi的接口傳回值主要有四種類型

void無傳回值

IHttpActionResult

HttpResponseMessage

自定義類型

此篇就圍繞這四塊分别來看看它們的使用。

void關鍵字我們都不陌生,它申明方法沒有傳回值。它的使用也很簡單,我們來看一個示例就能明白。

在Web裡面調用

得到結果

C#進階系列——WebApi 接口傳回值不困惑:傳回值類型詳解一、void無傳回值 二、IHttpActionResult三、HttpResponseMessage 四、自定義類型五、總結 

 可以看到,使用void申明的方法,在success方法裡面得不到傳回值,并且會傳回http狀态碼204,告訴用戶端此請求沒有傳回值。

IHttpActionResult類型是WebApi裡面非常重要的一種傳回值類型。下面部落客就根據平時在項目裡面使用最多的幾種方式來講解下這種類型的傳回值的一些用法。

使用MVC開發過的朋友一定記得,在MVC裡面,請求資料的接口的傳回值類型大部分使用的是JsonResult,在MVC裡面你一定也寫過類似這樣的接口:

那麼,在WebAPI裡面是否也存在類似的用法呢。呵呵,在這點上面,微軟總是貼心的。在WebApi的ApiController這個抽象類裡面,為我們封裝了Json&lt;T&gt;(T content)這個方法,它的用法和MVC裡面的JsonResult基本類似。我們通過一個例子來說明它的用法:

看到這個代碼,有人就疑惑了,我們定義的傳回值類型是IHttpActionResult類型,直接傳回Json&lt;T&gt;(T content)這樣可行麼?我們将Json轉到定義看看:

我們繼續将JsonResult&lt;T&gt;轉到定義

C#進階系列——WebApi 接口傳回值不困惑:傳回值類型詳解一、void無傳回值 二、IHttpActionResult三、HttpResponseMessage 四、自定義類型五、總結 

原來JsonResult&lt;T&gt;是實作了IHttpActionResult接口的,難怪可以直接傳回呢。

知道了這個,我們直接在Web裡面通過ajax請求來調用:

來看結果:

C#進階系列——WebApi 接口傳回值不困惑:傳回值類型詳解一、void無傳回值 二、IHttpActionResult三、HttpResponseMessage 四、自定義類型五、總結 

 既然實體類可以直接這樣傳遞,那麼如果我們想要傳遞一些匿名類型呢,因為很多情況下,我們需要傳回到前端的對象都沒有對應的實體來對應,如果我們想要傳回匿名對象怎麼辦呢?我們知道,這裡的Json&lt;T&gt;(T content)必須要傳一個對應的泛型類型,如果是匿名類型這裡肯定不好傳。還好有我們的object類型,當然你可以使用dynamic,我們來試一把。

同樣的來看測試結果:

C#進階系列——WebApi 接口傳回值不困惑:傳回值類型詳解一、void無傳回值 二、IHttpActionResult三、HttpResponseMessage 四、自定義類型五、總結 

除了Json&lt;T&gt;(T content),在ApiController裡面還有另外一個比較常用的方法:Ok()。同樣,我們将Ok()轉到定義

OkResult轉到定義

C#進階系列——WebApi 接口傳回值不困惑:傳回值類型詳解一、void無傳回值 二、IHttpActionResult三、HttpResponseMessage 四、自定義類型五、總結 

有了這個作為基礎,我們就可以放心大膽的使用了。

C#進階系列——WebApi 接口傳回值不困惑:傳回值類型詳解一、void無傳回值 二、IHttpActionResult三、HttpResponseMessage 四、自定義類型五、總結 

如果傳回Ok(),就表示不向用戶端傳回任何資訊,隻告訴用戶端請求成功。

除了Ok()之外,還有另外一個重載Ok&lt;T&gt;(T content)。

C#進階系列——WebApi 接口傳回值不困惑:傳回值類型詳解一、void無傳回值 二、IHttpActionResult三、HttpResponseMessage 四、自定義類型五、總結 

這種用法和Json&lt;T&gt;(T content)比較類似,如果你非要問這兩者有什麼差別,或者說怎麼選擇兩者。那麼我的了解是如果是傳回實體或者實體集合,建議使用Json&lt;T&gt;(T content),如果是傳回基礎類型(如int、string等),使用Ok&lt;T&gt;(T content)。

當需要向用戶端傳回找不到記錄時,有時需要用到NotFound()方法。

C#進階系列——WebApi 接口傳回值不困惑:傳回值類型詳解一、void無傳回值 二、IHttpActionResult三、HttpResponseMessage 四、自定義類型五、總結 

來看看它的使用場景

C#進階系列——WebApi 接口傳回值不困惑:傳回值類型詳解一、void無傳回值 二、IHttpActionResult三、HttpResponseMessage 四、自定義類型五、總結 

NotFound()方法會傳回一個404的錯誤到用戶端。

其他還有一些方法,都有它特定的用途。在此貼出來。

向用戶端傳回值和http狀态碼。

向用戶端傳回400的http錯誤。

将請求重定向到其他地方。

上面介紹了一些系統内置的常用的實作IHttpActionResult接口的方法。如果我們需要自定義IHttpActionResult的傳回呢?

在介紹之前,我們有必要先來看看IHttpActionResult類型的定義,将IHttpActionResult轉到定義可以看到:

這個接口包含唯一的一個方法ExecuteAsync(),此方法将以異步方式建立一個HttpResponseMessage執行個體傳回給用戶端。

有了這個作為基礎,下面,我們自定義一個bootstrapTable服務端分頁的子類去展示自定義IHttpActionResult的用法。

首先,自定義一個實作類

然後,在API接口裡面傳回PageResult對象

最好,ajax調用

C#進階系列——WebApi 接口傳回值不困惑:傳回值類型詳解一、void無傳回值 二、IHttpActionResult三、HttpResponseMessage 四、自定義類型五、總結 

在上文自定義IHttpActionResult傳回類型的時候,提到過HttpResponseMessage這個對象。它表示向用戶端傳回一個http響應的消息對象(包含http狀态碼和需要傳回用戶端的消息)。這個對象也有它獨特的使用場景:需要向用戶端傳回HttpResponse時就要用到這個對象。以導出為例,由于需要将導出的Excel檔案輸出到用戶端浏覽器,Webapi的服務端需要向Web的用戶端輸出檔案流,這個時候一般的IHttpActionResult對象不友善解決這個問題,于是HttpReponseMessage派上了用場。我們來看看它的使用示例。

将檔案流儲存在StreamContent對象裡面,然後輸出到浏覽器。在浏覽器端即可将Excel輸出。

以上幾種傳回值類型能解決我們大部分傳回值的問題,當然,你也可以将webapi的接口和普通方法一樣,傳回任意的類型,WebApi會自動序列化你自定義任何傳回類型,然後将序列化的值寫到響應正文裡,狀态碼統一傳回200。比如:

C#進階系列——WebApi 接口傳回值不困惑:傳回值類型詳解一、void無傳回值 二、IHttpActionResult三、HttpResponseMessage 四、自定義類型五、總結 

和上面的Json、Ok等用法在效果上面沒有太大差別。

以上通過四個方面詳細分享了下WebApi裡面傳回值的常見用法,不能說哪種方式最好,因為每種方式都有其特定的使用場景。部落客覺得為了規範WebApi接口,對于一般接口的傳回值,盡量使用IHttpActionResult類型作為傳回值,畢竟是微軟内置的東西,可能為我們考慮了很多我們考慮不到的東西。當然,你可能會覺得麻煩,你可能會說直接和普通方法一樣來使用不是更爽,部落客當初也有這種想法,可是學習微軟的東西多了之後發現很多東西還是遵守一定的标準比較好,至少維護起來友善。這就像部落客最近正在努力學習的WebApi+oData一樣,為什麼要搞這麼一套标準性的東西,還不是為了更加友善地規範Restful風格。如果本文能幫到你,不妨推薦下,您的推薦是部落客繼續總結的動力!