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會透過可攜式類別庫來進行服務呼叫。
- 新增專案 → 可攜式類別庫專案 → 名稱:ContosoClient。
- 進行可攜式類別庫條件設定。請設定為.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。
- 加入 → 新增專案 → 主控台應用程式 → 名稱:ContosoConsole
- 加入 → 新增專案 → Windows市集 → 空白的應用程式(XAML) → 名稱:ContosoStore
這裡可能會出現要求取得市集開發者授權請求,請依畫面登入取得。
- 透過 NuGet 為三個專案加入Microsoft.AspNet.WebApi.Client的參考。NuGet請選擇包括發行前版本。
- 為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
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。