[WebAPI]使用HttpClient呼叫WebAPI

  • 7388
  • 0
  • 2016-03-05

摘要:[WebAPI]使用HttpClient呼叫WebAPI

 

基本的Http概念

要使用HttpClient叫用Web API,首先需要對Http的處理有些基本的了解。不需要仔細地瞭解Http通訊協定的內容是什麼,只需要瞭解我們要送什麼資訊出去,要收什麼資訊回來,這樣就夠了。簡單的說,要送出的的資訊,會包含要連結的網址,Request(請求)的Header(檔頭),這包含了一些基本的資訊:可以接受的資料格式、瀏覽器資訊、資料編碼方式、Cookie。

如果Request(請求)是使用Get的方法,那麼基本上就只有Header(檔頭)的資訊。如果是使用非Get的方法,那麼除了Header之外,還會有其他的資訊需要包含在Http的內容(Content中)送出。最簡單及直接的方式,就是透過Fiddler去觀察,或是透過瀏覽器的開發者模式去查看網路資訊。

這是透過Fiddler的方式去觀察要送出去的資訊。這是透過HttpGet的方法送出Http Request,通常就是直接開啟某一個網頁,Request只會有網址以及Header。

如果是要進行登入的動作,通常就是透過HttpPost的方式把輸入的資訊送出。所以使用Fiddler觀察任一個登入頁面,可以看到類似的結果如下,但是會看到除了Header之外,還會有其他的資訊


 

切換到WebForms的標籤頁,會有較友善的介面可以看到那一串文字的資訊

 

HttpClient的簡介


HttpClient這個物件可以執行許多Http通訊協定中的大部分動作,也支援Web API中的Get, Post, Put, Delete的這幾個方法。要了解HttpClient如何呼叫Web API,可以參考這篇文章-中文,或是Microsoft的文章-英文,裡面也有實際的Sample Code可以參考。簡單來說,可以把HttpClient物件當作一個Http通訊管理員,我們可以把要傳給Web API的內容包成一個HttpRequestMessage物件交給HttpClient處理,HttpClient物件會依據指定的Address傳送該Request,並且把Response包裝成HttpResponseMessage物件交給我們處理。

如果是使用Get方法建立Request,因為只需要網址,不需要其他資訊。HttpClient可以簡單地使用以下程式碼進行叫用。

using (var client = new HttpClient())
{
    //設定Header - Accept的資料型別
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    
    //設定呼叫網址
    HttpResponseMessage response = await client.GetAsync("http://localhost:9000/api/products/1");
    
    //處理呼叫結果-Response
    if (response.IsSuccessStatusCode)
    {
        Product product = await response.Content.ReadAsAsync();
        
    }
}

 

如果是使用HttpPost的方法建立Request,除了網址之外,還可能需要其他的資訊。例如我們透過HttpPost是想要新增一筆資料到資料庫,這時候我們就需要把該筆資料傳到WebAPI上。一般來說,都是使用Json格式進行傳遞。

using (var client = new HttpClient())
{
    //設定Header - Accept的資料型別
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    
    //設定需傳遞物件及呼叫網址
    var gizmo = new Product() { Name = "Gizmo", Price = 100, Category = "Widget" };
    HttpResponseMessage response = await client.PostAsJsonAsync("http://localhost:9000/api/products", gizmo);
    
    
    //處理呼叫結果-Response
    if (response.IsSuccessStatusCode)
    {
        Uri gizmoUrl = response.Headers.Location;
    }
}

可以看到,除了我們換了一個method - PostAsJsonAsync()去執行HttpPost的呼叫外,我們在該method中也另外傳了一個物件-gizmoPostAsJsonAsync()會把該物件轉成Json格式進行傳遞。HttpPut與HttpDelete的處理與這兩者概念相同,HttpClient提供了PutAsJsonAsync()DeleteAsync()進行相對應的動作。