C# WebAPI系列(2)

上篇中簡單介紹了一下WebApi,本章主要介紹一下Controller相關的知識。html

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

Action返回類型

WebAPI服務函數的返回值主要能夠分爲void、普通對象、HttpResponseMessag、IHttpActionResult 四種,這裏簡單的介紹一下。app

Void類型

通常來講,Delete和Put類型的求情返回void類型的值,如:ide

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接口返回。例如:spa

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

HttpResponseMessag

HttpResponseMessage是標準Http應答了,此時服務器並不作任何處理,能夠直接將HttpResponseMessage發送給客戶端。設計

1  public HttpResponseMessage Get()
2  {
3         var response = Request.CreateResponse(HttpStatusCode.OK);
4         response.Content = new StringContent("Success", Encoding.UTF8);
5             
6         return response;
7   }
View Code

IHttpActionResult

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

1         public IHttpActionResult Get(int id)
2         {
3             var dto = new ProductDataDTO();
4             dto = AutoMapper.Mapper.Map<ProductDataDTO>(ProductDataService.QueryProductData (id));
5             return Ok(dto);
6         }
View Code

Action參數類型

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

POST請求

單一POST參數

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

[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,裏面提到了傳遞多個不一樣對象的狀況,我的也嘗試去試着調試,可是一直沒有成功,也就很差作過多的說明。後來想了下,其實能夠另闢蹊徑解決這個方法,新建一個對象,將要傳遞的對象作了屬性,這樣來傳遞給後臺接口。關於最後這種方式,你們感興趣能夠去看看原文。

相關文章
相關標籤/搜索