2013年6月7日 星期五

[C#] 使用HttpClient取得WebApi服務

使用HttpClient取得WebApi服務

JB

延續我們已經建立好的Book Web Api, 除了利用前端語法( 文章:使用jQuery取得WebApi服務 ) 去使用WebApiCRUD方法。 我們也也可以使用新的HttpClient 使用Web Api

※備註:
HttpClient
VS2012 內建於System.Net.Http (v4.0.0.0) 中,但是如果要使用文章中的PutAsJsonAsyncPostAsJsonAsync等方法,必須加入HttpClientExtensions 這個參考,最快的方式是直接使用Nuget下載「
MicrosoftASP.NET Web API Client Libraries」這個套件


1.           如果尚未建立Web Api,請參考以下表格,建立一個~

    

2.           加入Windows Form/ WPF /Console程式專案都可以,名稱:ApiClient

3.           新增以下Class ..



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並設定它的基底位址等資訊。

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
PostPutDelect都是一樣,所以只列出一次在Get.cs 中 Initial HttpClient的程式碼。

public class Get
{
 
private HttpClient API_CLIENT = null;
 
public Get()
  {
    
using(ApiSetting _apiSetting = new ApiSetting())
   {
     API_CLIENT = _apiSetting.CreateHttpClient();
   }
  }
    // …
}


7.           接下來是真正HttpClientWeb APi操控資料的部分~~

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);       
}


8.           至於其他實作的部分就請讀者自行設計了,以下列出幾張HttpClient使用Web Api的結果。






9.           Reference
Calling a Web API From a .NET Client (C#)

10.       結束












沒有留言:

張貼留言