WebApi接口返回值不困惑:返回值類型詳解


前言:已經有一個月沒寫點什么了,感覺心里空落落的。今天再來篇干貨,想要學習Webapi的園友們速速動起來,跟着博主一起來學習吧。作為程序猿,我們都知道參數和返回值是編程領域不可分割的兩大塊,此前分享了下WebApi的傳參機制,今天再來看看WebApi里面另一個重要而又基礎的知識點:返回值。

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

  • void無返回值
  • IHttpActionResult
  • HttpResponseMessage
  • 自定義類型

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

一、void無返回值

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

在Web里面調用

得到結果

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

二、IHttpActionResult

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

1、Json(T content)

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

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

看到這個代碼,有人就疑惑了,我們定義的返回值類型是IHttpActionResult類型,直接返回Json(T content)這樣可行么?我們將Json轉到定義看看:

我們繼續將JsonResult轉到定義

原來JsonResult是實現了IHttpActionResult接口的,難怪可以直接返回呢。

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

來看結果:

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

同樣的來看測試結果:

2、Ok()、 Ok(T content)

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

OkResult轉到定義

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

得到結果

如果返回Ok(),就表示不向客戶端返回任何信息,只告訴客戶端請求成功。

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

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

3、NotFound()

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

來看看它的使用場景

得到結果

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

4、其他

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

4.1、Content(HttpStatusCode statusCode, T value)

向客戶端返回值和http狀態碼。

4.2、BadRequest()

向客戶端返回400的http錯誤。

4.3、Redirect(string location)

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

5、自定義IHttpActionResult接口的實現

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

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

這個接口包含唯一的一個方法ExecuteAsync(),此方法將以異步方式創建一個HttpResponseMessage實例返回給客戶端。

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

首先,自定義一個實現類

然后,在API接口里面返回PageResult對象

最好,ajax調用

得到結果

三、HttpResponseMessage

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

將文件流保存在StreamContent對象里面,然后輸出到瀏覽器。在瀏覽器端即可將Excel輸出。

四、自定義類型

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

得到結果

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

五、總結

以上通過四個方面詳細分享了下WebApi里面返回值的常見用法,不能說哪種方式最好,因為每種方式都有其特定的使用場景。博主覺得為了規范WebApi接口,對於一般接口的返回值,盡量使用IHttpActionResult類型作為返回值,畢竟是微軟內置的東西,可能為我們考慮了很多我們考慮不到的東西。當然,你可能會覺得麻煩,你可能會說直接和普通方法一樣來使用不是更爽,博主當初也有這種想法,可是學習微軟的東西多了之后發現很多東西還是遵守一定的標准比較好,至少維護起來方便。這就像博主最近正在努力學習的WebApi+oData一樣,為什么要搞這么一套標准性的東西,還不是為了更加方便地規范Restful風格。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM