C# WebAPI學習


WebApi是微軟在VS2012 MVC4版本中綁定發行的,WebApi是完全基於Restful標准的框架。RestFul: (英文:Representational State Transfer,簡稱REST)網上關於Restful定義的資料很多,我個人理解的Restful api 是指基於資源的定義的接口,它的所有接口都是對資源的操作。REST的核心原則是將你的API拆分為邏輯上的資源。這些資源通過http被操作(GET ,POST,PUT,DELETE).Restful Api接口標准的定義滿足CURD,標准的接口定義如下:

  • Post:新增記錄
  • Put:修改記錄
  • Get:獲取數據
  • Delete:刪除數據

webapi標准的定義形式為:每個controller都對應一個Model,controller中的接口都應該是對controller所對應的那個model進行的操作,所以上訴的post,get,put,delete都是對model所對應的資源操作。但是在實際的操作中,可能沒有辦法完全滿足這種定義的形式,力求盡量滿足。

 

WebAPI項目和典型的MVC項目一樣,包含主要的Models,Views,Controllers等文件夾和Global.asax文件。Views對於WebAPI來說沒有太大的用途,Models中的Model主要用於保存Service和Client交互的對象,這些對象默認情況下會被轉換為Json格式的數據進行傳輸,Controllers中的Controller用於提供服務。和普通的MVC一樣,Global.asax用於配置路由規則。

在實際應用中,Controller是WebAPI的鏈接服務器和客戶端的窗口。Controller的好壞影響整個系統的設計。Controller中是各種Action接口,對於Action接口,我們有必要對其接收的參數和返回值了解。

Action返回類型

WebAPI服務函數的返回值主要可以分為void、普通對象、HttpResponseMessag、IHttpActionResult 四種,這里簡單的介紹一下。

Void類型

一般來說,Delete和Put類型的求情返回void類型的值,如:

public class DepartmentController : ApiController
{
        public void Delete(int id)
        {
            
        }
}

不過一個交互性好的接口,應該返回正確的Http status code,如返回200,對列子做修改:

public class DepartmentController : ApiController
{
    public HttpStatusCode Delete(int id)
  {
    return HttpStatusCode.OK;
  }
}    

 

普通對象

普通對象通常是由Get接口返回。例如:

public class CompanyController : ApiController
{
  public Company Get(int id)
   {
     return CompanyInfo;
   }
}

HttpResponseMessag

HttpResponseMessage是標准Http應答了,此時服務器並不做任何處理,可以直接將HttpResponseMessage發送給客戶端。

  public HttpResponseMessage Get()
  {
         var response = Request.CreateResponse(HttpStatusCode.OK);
         response.Content = new StringContent("Success", Encoding.UTF8);
             
         return response;
   }

IHttpActionResult

IHttpActionResult是Web API 2中引入的一個接口,IHttpActionResult是HttpResponseMessage的一個工廠類。IHttpActionResult是WebAPI中推薦的標准返回值,ApiController類中也提供了不少標准的工廠函數方便我們快速構建它們,如BadRequest,Conflict,Ok,NotFound等,一個簡單的示例如下:

 public IHttpActionResult Get(int id)
 {
      var dto = new ProductDataDTO();
      dto = AutoMapper.Mapper.Map<ProductDataDTO>(ProductDataService.QueryProductData (id));
      return Ok(dto);
}

 

Action參數類型

Get請求的參數,均在URI中給出,比較簡單,不做過多說明。下面主要對POST請求的參數做一下說明。

POST請求

單一POST參數

單一的參數請求,需要使用[FromBody]標記參數,如下圖所示:

[AcceptVerbs("POST")]
public string Post([FromBody]string data)
{
     return string.Format(@"Data:{1}",  data);
}

除了使用[FromBody]標記參數外,也可以使用dynamic關鍵字標記參數。

多個參數的POST請求

有了上面的經驗,多個參數的例子,按照常理來說,應該如下所示

[AcceptVerbs("POST")]
 public string Post([FromBody]string data, [FromBody]string name)
 {
     return string.Format(@"Name:{0},Data:{1}", name, data);
 }

但在實際調用中卻報錯,報錯如下:

查了資料,原因是在一個接口中,被[FromBody]修飾的參數只能有一個。對此,我們可以將上面的兩個參數封裝為一個對象傳遞。如下:

public class Person
{
  public string name { set; get; }
  public string message { set; get; }
}

......


[AcceptVerbs("POST")]
public string TEST4([FromBody]Person data)
{
  return string.Format(@"Name:{0},Message:{1}", data.name, data.message);
}

除此之外,還有另外一種方式實現,使用[FromURi]關鍵字,如下所示:

public string TEST2([FromUri]string data,[FromBody]string name)
{
  return string.Format(@"Name:{0},Data:{1}",name,data);
}

需要說明的是,在WebApi的接口參數中,在沒有標記的情況下,參數默認是[FromUri]形式,Get請求的接口的參數都是FromUri,顧名思議是從Uri獲取數據。一個接口可以有多個FromUri參數(這些參數一般都是簡單參數),但是只能有一個FromBody的參數。

就剛才的例子而言,data數據在Uri中獲取,而name數據則從body中獲取。

傳遞對象

有了上面的例子,其實傳遞對象在上面已經講過了,就是使用[FromBody]或dynamic標記參數。

傳遞不同的多個對象

這種情況,最近打算寫這篇文章的時候,查找資料的時候,在其他人的博文中看到的,地址如下:http://www.cnblogs.com/babycool/p/3922738.html,里面提到了傳遞多個不同對象的情況,個人也嘗試去試着調試,但是一直沒有成功,也就不好做過多的說明。后來想了下,其實可以另辟蹊徑解決這個方法,新建一個對象,將要傳遞的對象做了屬性,這樣來傳遞給后台接口。關於最后這種方式,大家感興趣可以去看看原文。


免責聲明!

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



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