c# WebApi之接口返回類型詳解


Webapi的接口返回值主要有四種類型

  1. void無返回值
  2. IHttpActionResult
  3. HttpResponseMessage
  4. 自定義類型

    void無返回值

    大家都知道void聲明的是一個無返回值的方法,聲明一個api控制器方法,例如:

public class ValuesController : ApiController { [HttpGet] public void Get() { int a = 1; int b = 2; int c = a + b; //..................... } }

使用postman,測試接口:

這里寫圖片描述
可以看到,void聲明的接口,在請求成功的時候得不到返回值,而且會返回http的狀態碼為204,表示沒有返回值。

IHttpActionResult

IHttpActionResult是WebApi最常用的一種返回值類型,常用的方式有:Json(T content)、Ok()、 Ok(T content)、NotFound()、Content(HttpStatusCode statusCode, T value)、BadRequest()、Redirect(string location)等

Json(T content)

在WebApi的ApiController這個抽象類里面,為我們封裝了Json(T content)這個方法,它的用法和MVC里面的JsonResult基本類似。

[HttpGet]
public IHttpActionResult getJson() { var list = new List<userinfo>(); list.Add(new userinfo { Name="jeck",age=22 }); list.Add(new userinfo { Name = "poor", age = 23 }); return Json<List<userinfo>>(list); } private class userinfo{ public string Name { get; set; } public int age { get; set; } }

測試結果: 
這里寫圖片描述

為什么可以返回 Json(T content)呢,轉到Json(T content)的定義,發現它返回的是JsonResult對象 
這里寫圖片描述

再轉到JsonResult的定義,發現它實現了IHttpActionResult接口 
這里寫圖片描述

當然也可以使用dynamic來返回一個對象

[HttpGet]
public IHttpActionResult getJson() { return Json<dynamic>(new { AA = "a", BB = "b" }); }

這里寫圖片描述

Ok()、 Ok(T content)

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

[HttpGet]
public IHttpActionResult getJson() { return Ok(); }

這里寫圖片描述

Ok(T content)向客戶端返回一個成功的對象

[HttpGet]
public IHttpActionResult getJson1() { string result = "請求成功!"; return Ok(result); }

這里寫圖片描述

NotFound()

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

[HttpGet]
public IHttpActionResult getJson() { return NotFound(); }

這里寫圖片描述

Content(HttpStatusCode statusCode, T value)

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

[HttpGet]
public IHttpActionResult getJson() { return Content<string>(HttpStatusCode.OK, "OK"); }

這里寫圖片描述

BadRequest()

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

[HttpGet]
public IHttpActionResult getJson2() { return BadRequest(); }

這里寫圖片描述

Redirect(string location)

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

[HttpGet]
public IHttpActionResult getJson3() { return Redirect("http://localhost:7408/api/Values/getJson1"); } [HttpGet] public IHttpActionResult getJson1() { string result = "請求成功!"; return Ok(result); }

這里寫圖片描述

HttpResponseMessage

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

public HttpResponseMessage Export() { //取數據 var lstRes = OrderBLL.Export(); //向Excel里面填充數據 HSSFWorkbook workbook = new HSSFWorkbook(); CreateAndFillSheet(workbook, lstRes); //保存到服務 var fileName = "Excel" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls"; var strPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Data\" + fileName); using (FileStream fs = new FileStream(strPath, FileMode.Create)) { workbook.Write(fs); using (MemoryStream ms = new MemoryStream()) { workbook.Write(ms); } } //輸出到瀏覽器 try { var stream = new FileStream(strPath, FileMode.Open); HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK); response.Content = new StreamContent(stream); response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = fileName }; return response; } catch { return new HttpResponseMessage(HttpStatusCode.NoContent); } }

自定義類型

你也可以將webapi的接口和普通方法一樣,返回任意的類型,WebApi會自動序列化你自定義任何返回類型,然后將序列化的值寫到響應正文里,狀態碼統一返回200。

[HttpGet]
public object getJson() { var list = new List<userinfo>(); list.Add(new userinfo { Name = "work", age = 11 }); list.Add(new userinfo { Name = "hard", age = 12 }); return list; }

這里寫圖片描述

 


免責聲明!

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



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