標籤:
原文的連結:http://www.cnblogs.com/TianFang/p/3724449.html
WebAPI是標準的Http協議,支援Http協議的用戶端(如瀏覽器)都可以訪問。但是,有的時候我們如果想在自己的程式中使用WebAPI時,此時就要實現自己的用戶端了。我之前介紹過在.Net 4.5中新增的HttpClient庫,它對Http操作實現了非常好的封裝。我們可以通過它實現Http訪問,例如,我們對前文所示的API進行一次Post操作:
// POST: api/Values
public void Post(Product value)
{
}
首先對HttpClient進行一些初始化操作:
var client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:1282/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
這裡主要進行了兩部操作:1. 定義了預設的基地址,減少後續的URL長度,2. 定義了預設的接受的資料類型為Json。
下一步就要開始對Product對象的內容編碼,預設是xml或json,這裡我選擇相對簡單的json:
var product = new Product() { Id = 1, Name = "food" };
var content = Newtonsoft.Json.JsonConvert.SerializeObject(product);
var httpContent = new StringContent(content, Encoding.UTF8);
httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json") { CharSet = "utf-8" };
await httpContent.LoadIntoBufferAsync();
var rsp = await client.PostAsync("api/values", httpContent);
從上面的代碼可以看出,由於WebAPI不像WCF那樣能自動產生用戶端代碼,需要我們自己封裝對象,上面光封裝對象就用了四行代碼,對於不熟悉HttpClientd 朋友來說還是比較容易出錯的。因此微軟提供了一系列擴充函數方便我們簡化這一過程。
在NUGET中安裝WebApi.Client庫
這個庫安裝後會在引用中增加一個System.Net.Http.Formatting的程式集,它主要提供了一系列擴充函數(其實裝這個庫順帶也會把HttpClient和Json.Net一併岸上),現在上面的代碼就可以簡化如下了:
var product = new Product() { Id = 1, Name = "food" };
var rsp = await client.PostAsJsonAsync("api/values", product);
除了PostAsJsonAsync這個擴充函數外,還提供了PostAsXmlAsync這種以XML傳輸的方式。同樣,Put也有PutAsJsonAsync和PutAsXmlAsync的擴充版本。對於Get,雖然也提供了擴充函數,但是使用的方式稍有不同:
var rsp = await client.GetAsync("api/values/1");
rsp.EnsureSuccessStatusCode();
var product = await rsp.Content.ReadAsAsync<Product>();
對於Delete,卻沒有提供擴充函數,可能是官方認為Delete直接在URL中就傳ID就夠用了,沒必要在Request中封裝訊息了吧。
使用ASP.Net WebAPI構建REST服務——用戶端