Web API Client Library+Portable Library打造跨平台的Web API服務類別

Web API Client Library與Portable Library

ASP.NET Web API Client Library(HttpClient)讓我們簡單地在.NET用戶端應用程式中與RESTful HTTP Service互動。之前版本的Web API Client Library對於跨平台的支援度不是那麼好,目前Web API Client Library的下一個預覽版已經在這方面進行改良。此預覽版新增了可攜式類別庫(Portable Library)的支援,目前支援.NET Framework 4.5、Windows Store、Windows Phone 8三種應用程式類別。這些支援建構在最近發佈的可攜式HTTPClient和可攜式類別庫支援Json.NET。這樣我們就能建立單一的可攜式類別庫去讓Windows Store App、Windows Phone去呼叫Web API。

建立不同平台的專案

接下來,我們要建立三個專案,一個可攜式類別庫,透過可攜式類別庫使用Web API Client Library來呼叫RESTful HTTP Service,一個.NET Framework 4.5的主控台應用程式,一個Windows Store App,主控台應用程式與Windows Store App會透過可攜式類別庫來進行服務呼叫。

  1. 新增專案 → 可攜式類別庫專案 → 名稱:ContosoClient
  2. 進行可攜式類別庫條件設定。請設定為.NET Framework 4.5、Windows Phone 8、.NET for Windows Store App
    這是因為ASP.NET Web API Client Library不支援 xbox 360、Silverlight和Windows Phone 7.5。以下範例不進行Windows Phone 8示範,不過我們的建立的可攜式類別庫是可以支援Windows Phone 8。
  3. 加入 → 新增專案 → 主控台應用程式 → 名稱:ContosoConsole
  4. 加入 → 新增專案 → Windows市集 → 空白的應用程式(XAML) → 名稱:ContosoStore
    這裡可能會出現要求取得市集開發者授權請求,請依畫面登入取得。
  5. 透過 NuGet 為三個專案加入Microsoft.AspNet.WebApi.Client的參考。NuGet請選擇包括發行前版本
  6. 為ContosoConsole與ContosoStore專案加入對ContosoClient的參考。

ContosoClient - 可攜式類別庫

這裡的動作很簡單,我們存取一個範例用的Contoso Recipe sample service,取得JSON後反序列它到一個DTO物件(RecipeDataItemDto ),DTO物件只簡單包含ID與Title,然後回傳結果。

新增RecipeDataAgent類別,撰寫以下程式碼:

Imports System.Net.Http
Imports System.Net.Http.Formatting
Imports System.Net.Http.Headers
Imports Newtonsoft.Json
Imports System.Threading.Tasks

Public Class RecipeDataAgent
    ''' <summary>
    ''' 透過 HttpClient 呼叫 Web API 取得 JSON 反序列化為 DTO 物件並回傳
    ''' HttpClient 基本用法請參考ASP.NET MVC 4網站開發美學 P. 7-86
    ''' </summary>
    Public Async Function GetRecipeDataItemsAsync() As Task(Of IEnumerable(Of RecipeDataItemDto))
        Dim client As HttpClient = New HttpClient()
        client.BaseAddress = New Uri("http://contosorecipes8.blob.core.windows.net/")
        Dim jsonTypeFormatter = New JsonMediaTypeFormatter()
        jsonTypeFormatter.SupportedMediaTypes.Add(
            New MediaTypeHeaderValue("application/octet-stream"))
        Dim response = Await client.GetAsync(("AzureRecipesRP"))
        Return Await response.Content.ReadAsAsync(
            Of List(Of RecipeDataItemDto))({jsonTypeFormatter})
    End Function

End Class

''' <summary>
''' DTO物件定義
''' </summary>
Public Class RecipeDataItemDto
    <JsonProperty("Key")>
    Public Property UniqueId As String
    Public Property Title As String
End Class

  

ContosoConsole - 主控台應用程式

主控台應用程式已經加入ContosoClient專案的參考,只需要呼叫ContosoClient專案裡的GetRecipeDataItemsAsync方法即可透過HttpClient為我們呼叫Web API及取回JSON且對應至DTO物件後回傳。我們只是拿回傳的DTO物件使用。

Imports ContosoClient

Module Module1

    Sub Main()
        CallRecipeServiceAsync().Wait()
    End Sub

    Public Async Function CallRecipeServiceAsync() As task
        Dim recipes = Await New RecipeDataAgent().GetRecipeDataItemsAsync()
        For Each receipe In recipes
            Console.WriteLine("Id: {0}, Title: {1}", receipe.UniqueId, receipe.Title)
        Next
    End Function
End Module   
  

按Ctrl+F5看見到以下執行結果:

ContosoStore - Windows Store App

這裡的應用和ContosoConsole一樣。

開啟 MainPage.xaml 於 XAML 的 <Grid> 中加入 ListView 設置:

   <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
       <ListView x:Name="itemListView" />
   </Grid>
  

開啟 MainPage.xaml.vb 新增 UpdateListView(),然後於 OnNavigatedTo() 呼叫。

Imports ContosoClient

Public NotInheritable Class MainPage
    Inherits Page

    Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs)
        UpdateListView()
    End Sub

    Public Async Sub UpdateListView()
        Dim recipes = Await New RecipeDataAgent().GetRecipeDataItemsAsync()
        For Each receipe In recipes
            itemListView.Items.Add(receipe.Title)
        Next
    End Sub
End Class
  

以上透過可攜式類別庫與支援可攜式類別庫的Web API Client Library建立一支跨平台使用的類別庫,不管是.NET Framework 4.5的應用程式、Windows Phone 8、Windows Store App都可以很容易去呼叫使用此Web API Client Library建立的可攜式類別庫。

參考資料:Writing Web API Client Code for Multiple Platforms Using Portable Libraries

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。