標籤:style class code ext color c
預設綁定方式
WebAPI把參數分成了簡單類型和複雜類型:
- 簡單類型主要包括CLR的primitive types,(int、double、bool等),系統內建的幾個strcut類型(TimeSpan、Guid等)以及string。對於簡單類型的參數,預設從URI中擷取。
- 複雜類型的資料也可以直接作為參數傳入進來,系統使用media-type formatter進行解析後傳給服務函數。對於複雜類型,預設從本文中擷取,
例如,對於如下函數
HttpResponseMessage Put(int id, Product item)
其id預設從url中擷取,其item預設從本文中擷取。
使用 [FromUri] 標記從URI中綁定參數
我們可以使用 [FromUri] 標記強制從URI中綁定參數,例如
publicclassGeoPoint
{
publicdouble Latitude { get; set; }
publicdouble Longitude { get; set; }
}
publicValuesController : ApiController
{
publicHttpResponseMessage Get([FromUri] GeoPoint location) { ... }
}
這樣,Get參數就是從URI中擷取了。需要注意的是,此時我們必須將GeoPoint的屬性在URI中傳入: http://localhost/api/values/?Latitude=47.678558&Longitude=-122.130989 。這種預設的序列化方式比較冗長,我們也可以自訂還原序列化格式為類似這樣的形式:http://localhost/api/values/?location=47.678558,-122.130989,具體方法請參看參考文檔 Type Converters 的一節。
使用 [FromBody] 標記從本文中綁定參數
同樣,我們可以使用 [FromBody] 標記強制從本文中綁定參數,例如
publicHttpResponseMessage Post([FromBody] string name)
此時,我們則
POST http://localhost:5076/api/values HTTP/1.1
User-Agent: Fiddler
Host: localhost:5076
Content-Type: application/json
Content-Length: 7
"Alice"
需要注意的是這兒的Content-Type必須和本文的序列化方式一致,這兒使用的是json序列化,因此類型是application/json。系統自動使用Media Formatters將其轉換為目標對象。
綁定多個參數
前面介紹的方式中,只能從URI中綁定一個參數,雖然可以通過傳入複雜類型解決多參數的問題,但很多時候不如在URI中來得直接。此時,我們則可以使用前面介紹的特性路由來實現多參的綁定,例如:
[Route("api/{controller}/{year}/{month}/{day}")]
publicstring Get(int year, int month, int day)
{
returnstring.Join(",", year, month, day);
}
參考文檔: http://www.asp.net/web-api/overview/formats-and-model-binding