Tin tức ASP.NET Web API – Xây dựng ứng dụng khách bằng lớp HttpClient

ASP.NET Web API – Xây dựng ứng dụng khách bằng lớp HttpClient

Ngày đăng: - chuyên mục Bài viết đơn
Giới thiệu về lớp HttpClient
HttpClient là một lớp giúp xây dựng trình khách gởi và nhận các thông điệp HTTP cho nền tảng .NET. Nó cung cấp API để có thể truy xuất mọi thứ được truyền tải qua giao thức HTTP. HTTPClient là lớp của thư nền tảng ASP.NET Web API và bên trong .NET 4.5. Bạn cũng có thể tải nó bằng NuGet. Chúng ta sẽ cùng các gói NuGet sau:

1. System.Net.Http: Gói NuGet chính gồm lớp HttpClient và các lớp liên quan

2. System.Net.Http.Formatting: Hỗ trợ serialization và deserialization và một số các tính năng xây dựng dựa trên System.Net.Http

3. System.Json: hỗ trợ kỹ thuật JsonValue cho việc đọc và sinh các tài liệu JSON.

HttpClient là lớp được dùng để gởi và nhận HttpRequestMessage và HttpResponseMessage (các thông điệp Http). Bạn có thể tìm hiểu thêm ở bài viết Quản lý thông điệp HTTP trên ASP.NET Web API.
Xây dựng phần mềm WorldBankClient
Ứng dụng này được xây dựng trên nền Windows 8, .NET Framework 4.5 bằng cách sử dụng Visual Studio 11 Beta. Bạn sẽ tạo một dự án WPF với tên là WorldBankClient.

Ứng dụng của chúng ta sẽ lấy dữ liệu từ WorldBank và điền vào một ListView ở trang MainWindow.xaml.

Để sử dụng được HttpClient, bạn cần sử dụng 2 gói NuGet như hình bên dưới, gói System.Json sẽ được tải kèm.


Trước tiên chúng ta định nghĩa lớp CountryData để lưu giữ thông tin lấy về (gồm tên quốc gia, mã quốc gia, thủ đô, tọa độ)
namespace WorldBankClient.Model
{
    public class CountryData
    {
        public string Name { get; set; }
        public string CountryCode { get; set; }
        public string CapitalCity { get; set; }
        public string Longitude { get; set; }
        public string Latitude { get; set; }
    }
}
 
Chúng ta quy định giao diện của MainWindow như sau:
 
<Window x:Class="WorldBankClient.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <ListView x:Name="CountryListView" Height="300">
                <ListView.View>
                    <GridView>
                        <GridViewColumn Width="Auto" Header="Quoc gia" 
                                        DisplayMemberBinding="{Binding Name}"/>
                        <GridViewColumn Width="Auto" Header="Ma Quoc gia" 
                                        DisplayMemberBinding="{Binding CountryCode}" />
                        <GridViewColumn Width="Auto" Header="Thu do"
                                        DisplayMemberBinding="{Binding CapitalCity}" />
                        <GridViewColumn Width="Auto" Header="Latitude"
                                        DisplayMemberBinding="{Binding Latitude}"/>
                        <GridViewColumn Width="Auto" Header="Longitude"
                                        DisplayMemberBinding="{Binding Longitude}"/>
                    </GridView>
                </ListView.View>
            </ListView>
        </StackPanel>
    </Grid>
</Window>
 
Trong đó chúng ta sử dụng ListView để hiển thị danh sách các nước được lấy về.

Trong tập tin MainWindow.xaml.cs chúng ta sẽ thêm một biến trong lớp Windows để lưu địa chỉ dịch vụ HTTP của WorldBank:
 
static string _address = "http://api.worldbank.org/countries?format=json"; 

Sau đó chúng ta cần định nghĩa biến _CountryData để lưu danh sách các nước được lấy về từ dịch vụ HTTP.
 
private IList<CountryData> _CountryData = new List<CountryData>(); 
Bây giờ tới phần quan trọng nhất, đó là sử dụng lớp HttpClient để triệu gọi dịch vụ HTTP, sau đó lưu vào biến _CountryData. Các thao tác này được cài đặt trong phương thức GetCountryData.
private async void GetCountryData(){
            // Create an HttpClient instance 
            HttpClient client = new HttpClient();

            // Send a request asynchronously continue when complete 
            await client.GetAsync(_address).ContinueWith(
                (requestTask) =>
                {
                    // Get HTTP response from completed task. 
                    HttpResponseMessage response = requestTask.Result;

                    // Check that response was successful or throw exception 
                    response.EnsureSuccessStatusCode();

                    // Read response asynchronously as JsonValue and write out top facts for each country 
                    response.Content.ReadAsAsync<JsonArray>().ContinueWith(
                        (readTask) =>
                        {
                            foreach (var country in readTask.Result[1])
                            {
                                var countryData = new CountryData {
                                    Name = (string)country.Value["name"],
                                    CountryCode = (string)country.Value["iso2Code"],
                                    CapitalCity = (string)country.Value["capitalCity"],
                                    Latitude = (string)country.Value["latitude"],
                                    Longitude = (string)country.Value["longitude"]
                                };
                                _CountryData.Add(countryData);  
                            }
                        });
                });

            CountryListView.ItemsSource = _CountryData;
        }
 

Lưu ý rằng chúng ta sử dụng cách thức gọi các phương thức lấy dữ liệu bất đồng bộ mới của .NET Framework 4.5 đó là sử dụng các từ khóa async, await. Vì sao chúng ta sử dụng từ khóa await khi gọi hàm client.Async? Đó là bởi vì chúng ta cần quy định ItemSource cho CountryListView, và chúng ta cần phải đợi khi dữ liệu được lấy về hoàn toàn.

Tới ngang đây, các bạn sẽ đặt dấu hỏi tại sao chúng không gọi phương thức GetCountryData theo kiểu bất đồng bộ (await GetCountryData). Câu trả lời là nếu chúng ta gọi theo kiểu bất đồng bộ, phương thức này sẽ được thực hiện ở một thread khác chứ không phải là UI Thread, và vì vậy chúng ta không được phép truy xuất vào đối tượng CountryListView, và như vậy thì chúng ta không thể hiển thị dữ liệu sau khi đã gọi được.

Ở đây, chúng ta đã phần nào không tuân thủ khuyến cáo mới về lập trình ứng dụng của Microsoft, đó là sử dụng các thao tác truy xuất dữ liệu một cách bất đồng bộ để tránh làm cho giao diện bị đông cứng khi ta thao tác quá lâu với công việc logic bên dưới. Để tuân thủ theo điều này thật không khó, nhưng tôi để lại như là một bài tập nhỏ cho các bạn.

Kết quả khi chạy chương trình như sau:



Như vậy tôi đã giúp các bạn có thể tự xây dựng ứng dụng sử dụng HttpClient để truy vấn các dịch vụ HTTP. Ngoài ra các bạn có thể tham khảo thêm cách sử dụng JavaScript để tương tác với các dịch vụ HTTP ở bài viết Xây dựng ứng dụng sử dụng Web API hỗ trợ các thao tác CRUD.

Happy coding!

Bài viết này được cung cấp bởi MVP [Lê Hoàng Dũng]

Liên hệ

Để được hỗ trợ và tư vấn trực tiếp hãy liên hệ với chúng tôi ngay bây giờ.
CÔNG TY TNHH PHẦN MỀM L.I.B.S
183/2, Khu phố Thạnh Lợi,
Phường An Thạnh, Thị xã Thuận An,
Tỉnh Bình Dương
Hotline: 0906442230
© 2015 LIBS Software