使用HttpClient取得WebApi服務
JB
延續我們已經建立好的Book Web Api,
除了利用前端語法( 文章:使用jQuery取得WebApi服務 ) 去使用WebApi的CRUD方法。 我們也也可以使用新的HttpClient 使用Web Api。
※備註:
HttpClient 在VS2012 內建於System.Net.Http (v4.0.0.0) 中,但是如果要使用文章中的PutAsJsonAsync、PostAsJsonAsync等方法,必須加入HttpClientExtensions 這個參考,最快的方式是直接使用Nuget下載「MicrosoftASP.NET Web API Client Libraries」這個套件。
※備註:
HttpClient 在VS2012 內建於System.Net.Http (v4.0.0.0) 中,但是如果要使用文章中的PutAsJsonAsync、PostAsJsonAsync等方法,必須加入HttpClientExtensions 這個參考,最快的方式是直接使用Nuget下載「MicrosoftASP.NET Web API Client Libraries」這個套件。
2.
加入Windows Form/ WPF /Console程式專案都可以,名稱:ApiClient
4.
Book.cs
public class Book
{ public string ID { get; set; } public string NAME { get; set; } public Nullable<decimal> PRICE { get; set; } } |
5.
AppSetting.cs
在此類別建立HttpClient並設定它的基底位址等資訊。
在此類別建立HttpClient並設定它的基底位址等資訊。
public class ApiSetting : IDisposable
{ public static String API_URL = "http://localhost:33855/"; public static String ROUTE_URI = "api/Book/"; /// <summary> /// Create a HttpClient /// </summary> /// <returns></returns> public HttpClient CreateHttpClient() { //Intial HttpClient HttpClient API_CLIENT = new HttpClient(); //Set the http service uri API_CLIENT.BaseAddress = new Uri(ApiSetting.API_URL); //The http service is based on JSON format API_CLIENT.DefaultRequestHeaders.Accept.Add( new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); return API_CLIENT; } } |
6.
請記得在使用Web
Api服務前,先利用上面的ApiSetting建立一個HttpClient:
Get、Post、Put、Delect都是一樣,所以只列出一次在Get.cs 中 Initial HttpClient的程式碼。
Get、Post、Put、Delect都是一樣,所以只列出一次在Get.cs 中 Initial HttpClient的程式碼。
public class Get
{ private HttpClient API_CLIENT = null; public Get() { using(ApiSetting _apiSetting = new ApiSetting()) { API_CLIENT = _apiSetting.CreateHttpClient(); } } // … } |
7.
接下來是真正HttpClient從Web APi操控資料的部分~~
GET (取得所有資料)
GET (取得所有資料)
public void GetWebApi()
{ String msg; //使用非同步方法 HttpResponseMessage resp = API_CLIENT.GetAsync(ApiSetting.ROUTE_URI).Result; if (resp.IsSuccessStatusCode) { var books = resp.Content.ReadAsAsync<IEnumerable<Book>>().Result; foreach (var book in books) { msg = String.Format("代號 {0},書名 {1},價格 {2} \n", book.ID, book.NAME, book.PRICE.ToString()); } } else { msg = String.Format("{0} {1}", (int?)resp.StatusCode, resp.ReasonPhrase)); } Console.WriteLine(msg); } |
GET (取得單筆資料)
public void GetWebApi_ById(String id)
{ String msg; //組出GET Uri : api/Book/{id} String getRouteUri = ApiSetting.ROUTE_URI + id; //使用非同步方法 HttpResponseMessage resp = API_CLIENT.GetAsync(getRouteUri).Result; if (resp.IsSuccessStatusCode) { var book = resp.Content.ReadAsAsync<Book>().Result; msg = (book == null) ? "查無資料!" :String.Format("代號 {0},書名 {1},價格 {2} \n", book.ID, book.NAME, book.PRICE.ToString()); } else { msg = String.Format("{0} {1}", (int?)resp.StatusCode, resp.ReasonPhrase); } Console.WriteLine(msg);
}
|
POST (建立單筆資料)
public void PostWebApi(Book book)
{ String msg = ""; //方法一: 使用 PostAsJsonAsync var resp = API_CLIENT.PostAsJsonAsync(ApiSetting.ROUTE_URI, book).Result; ///方法二: 使用 PostAsync /* // Create the JSON formatter. MediaTypeFormatter jsonFormatter = new JsonMediaTypeFormatter(); // Use the JSON formatter to create the content of the request body. HttpContent content = new ObjectContent<Book>(book, jsonFormatter); // Send the request. HttpResponseMessage resp = API_CLIENT.PostAsync("api/book", content).Result; */ if (resp.IsSuccessStatusCode){ msg = String.Format("新增成功 : {0} {1}", (int?)resp.StatusCode, resp.ReasonPhrase); } else{ msg = String.Format("新增失敗 : {0} {1}", (int?)resp.StatusCode, resp.ReasonPhrase); } Console.WriteLine(msg); } |
DELET (刪除單筆資料)
public void DeleteWebApi(String id)
{ String msg = ""; //組出DELETE Uri : api/Book/{id} String delRouteUrl = ApiSetting.ROUTE_URI + id; ///使用 DeleteAsync var resp = API_CLIENT.DeleteAsync(delRouteUrl).Result; if (resp.IsSuccessStatusCode){ msg = String.Format("刪除成功 : {0} {1}", (int?)resp.StatusCode, resp.ReasonPhrase); } else{ msg = String.Format("刪除失敗 : {0} {1}", (int?)resp.StatusCode, resp.ReasonPhrase); } Console.WriteLine(msg); } |
PUT (更新單筆資料)
public void PutWebApi(Book book)
{ String msg = ""; ///組出PUT Uri : api/Book/{id} String putRouteUri = ApiSetting.ROUTE_URI + book.ID; ///使用 PutAsJsonAsync var resp = API_CLIENT.PutAsJsonAsync(putRouteUri, book).Result; if (resp.IsSuccessStatusCode){ msg = String.Format("更新成功 : {0} {1}", (int?)resp.StatusCode, resp.ReasonPhrase); } else{ msg = String.Format("更新失敗 : {0} {1}", (int?)resp.StatusCode, resp.ReasonPhrase); } Console.WriteLine(msg); } |
9.
Reference:
Calling a Web API From a .NET Client (C#)
Calling a Web API From a .NET Client (C#)
10.
結束
沒有留言:
張貼留言