ASP.NET Web API - HttpClient

Sử dụng Web API trong .NET bằng cách sử dụng HttpClient

Lớp .NET 2.0 bao gồm WebClient để giao tiếp với máy chủ web bằng giao thức HTTP. Tuy nhiên, lớp WebClient có một số hạn chế. Lớp .NET 4.5 bao gồm lớp HttpClient để khắc phục hạn chế của WebClient. Ở đây, chúng ta sẽ sử dụng lớp HttpClient trong ứng dụng console để gửi dữ liệu đến và nhận dữ liệu từ Web API được lưu trữ trên máy chủ web IIS cục bộ. Bạn cũng có thể sử dụng HttpClient trong các ứng dụng .NET khác như MVC Web Application, ứng dụng windows form, ứng dụng windows service, v.v.

Chúng ta hãy xem cách sử dụng Web API bằng cách sử dụng HttpClient trong ứng dụng console.

Chúng ta sẽ sử dụng Web API sau đây được tạo trong phần trước.

Ví dụ: Web API Controller

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace MyWebAPI.Controller
{
    public class StudentController : ApiController
    {
        public IHttpActionResult GetAllStudents(bool includeAddress = false)
        {
            IList<StudentViewModel> students = null;

            using (var ctx = new SchoolDBEntities())
            {
                students = ctx.Students.Include("StudentAddress").Select(s => new StudentViewModel()
                {
                    Id = s.StudentID,
                    FirstName = s.FirstName,
                    LastName = s.LastName,
                    Address = s.StudentAddress == null || includeAddress == false ? null : new AddressViewModel()
                    {
                        StudentId = s.StudentAddress.StudentID,
                        Address1 = s.StudentAddress.Address1,
                        Address2 = s.StudentAddress.Address2,
                        City = s.StudentAddress.City,
                        State = s.StudentAddress.State
                    }
                }).ToList<StudentViewModel>();
            }

            if (students.Count == 0)
            {
                return NotFound();
            }

            return Ok(students);
        }

        public IHttpActionResult PostNewStudent(StudentViewModel student)
        {
            if (!ModelState.IsValid)
                return BadRequest("Not a valid data");

            using (var ctx = new SchoolDBEntities())
            {
                ctx.Students.Add(new Student()
                {
                    StudentID = student.Id,
                    FirstName = student.FirstName,
                    LastName = student.LastName
                });

                ctx.SaveChanges();
            }
            return Ok();
        }

        public IHttpActionResult Put(StudentViewModel student)
        {
            if (!ModelState.IsValid)
                return BadRequest("Not a valid data");

            using (var ctx = new SchoolDBEntities())
            {
                var existingStudent = ctx.Students.Where(s => s.StudentID == student.Id).FirstOrDefault<Student>();

                if (existingStudent != null)
                {
                    existingStudent.FirstName = student.FirstName;
                    existingStudent.LastName = student.LastName;

                    ctx.SaveChanges();
                }
                else
                {
                    return NotFound();
                }
            }
            return Ok();
        }


        public IHttpActionResult Delete(int id)
        {
            if (id <= 0)
                return BadRequest("Not a valid studet id");

            using (var ctx = new SchoolDBEntities())
            {
                var student = ctx.Students
                    .Where(s => s.StudentID == id)
                    .FirstOrDefault();

                ctx.Entry(student).State = System.Data.Entity.EntityState.Deleted;
                ctx.SaveChanges();
            }
            return Ok();
        }
    }
}

Bước 1:

Đầu tiên, tạo một ứng dụng bảng điều khiển trong Visual Studio 2022 cho Desktop.

Bước 2:

Mở bảng điều khiển NuGet Package Manager từ TOOLS -> NuGet Package Manager -> Package Manager Console và thực hiện lệnh sau.

Install-Package Microsoft.AspNet.WebApi.Client

Bước 3:

Bây giờ, tạo một lớp mô hình Student vì chúng ta sẽ gửi và nhận đối tượng Student đến Web API của mình.

Ví dụ: Lớp Model

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Gửi yêu cầu GET

Ví dụ sau đây gửi yêu cầu HTTP GET đến Student Web API và hiển thị kết quả trong bảng điều khiển. 

Ví dụ: Gửi yêu cầu HTTP GET bằng HttpClient

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
using System.Net.Http.Headers;

namespace HttpClientDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("http://localhost:60464/api/");
                //HTTP GET
                var responseTask = client.GetAsync("student");
                responseTask.Wait();

                var result = responseTask.Result;
                if (result.IsSuccessStatusCode)
                {

                    var readTask = result.Content.ReadAsAsync<Student[]>();
                    readTask.Wait();

                    var students = readTask.Result;

                    foreach (var student in students)
                    {
                        Console.WriteLine(student.Name);
                    }
                }
            }
            Console.ReadLine();
        }        
    }
}

Hãy cùng tìm hiểu từng bước trong ví dụ trên.

Đầu tiên, chúng ta đã tạo một đối tượng của HttpClient và gán địa chỉ cơ sở cho Web API. Phương thức GetAsync() gửi yêu cầu http GET đến url đã chỉ định. Phương thức GetAsync() không đồng bộ và trả về một Task. Task.wait() tạm dừng thực thi cho đến khi phương thức GetAsync() hoàn tất thực thi và trả về kết quả.

Sau khi thực thi hoàn tất, chúng ta sẽ nhận được kết quả từ Task bằng cách sử dụng Task.result, đó là HttpResponseMessage. Bây giờ, bạn có thể kiểm tra trạng thái của phản hồi http bằng cách sử dụng IsSuccessStatusCode. Đọc nội dung của kết quả bằng cách sử dụng phương thức ReadAsAsync().

Do đó, bạn có thể gửi yêu cầu http GET bằng đối tượng HttpClient và xử lý kết quả.

Gửi yêu cầu POST

Tương tự như vậy, bạn có thể gửi yêu cầu HTTP POST bằng cách sử dụng phương thức PostAsAsync() của HttpClient và xử lý kết quả theo cùng cách như yêu cầu GET.

Ví dụ sau đây gửi yêu cầu http POST đến Web API của chúng ta. Nó đăng đối tượng Student dưới dạng json và nhận được phản hồi.

Ví dụ: Gửi yêu cầu HTTP POST bằng HttpClient

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
using System.Net.Http.Headers;

namespace HttpClientDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var student = new Student() { Name = "Steve" };

            var postTask = client.PostAsJsonAsync<Student>("student", student);
            postTask.Wait();

            var result = postTask.Result;
            if (result.IsSuccessStatusCode)
            {

                var readTask = result.Content.ReadAsAsync<Student>();
                readTask.Wait();

                var insertedStudent = readTask.Result;

                Console.WriteLine("Student {0} inserted with id: {1}", insertedStudent.Name, insertedStudent.Id);
            }
            else
            {
                Console.WriteLine(result.StatusCode);
            }
        }
    }
}

Bảng sau liệt kê tất cả các phương thức của HttpClient để gửi các yêu cầu HTTP khác nhau.

Tên Phương thức Mô tả
GetAsync Gửi yêu cầu GET đến Uri được chỉ định như một hoạt động không đồng bộ.
GetByteArrayAsync Gửi yêu cầu GET đến Uri đã chỉ định và trả về nội dung phản hồi dưới dạng một mảng byte trong một hoạt động không đồng bộ.
GetStreamAsync Gửi yêu cầu GET đến Uri đã chỉ định và trả về nội dung phản hồi dưới dạng luồng trong một hoạt động không đồng bộ.
GetStringAsync Gửi yêu cầu GET đến Uri đã chỉ định và trả về nội dung phản hồi dưới dạng chuỗi trong một hoạt động không đồng bộ.
PostAsync Gửi yêu cầu POST đến Uri được chỉ định như một hoạt động không đồng bộ.
PostAsJsonAsync Gửi yêu cầu POST dưới dạng hoạt động không đồng bộ đến Uri đã chỉ định với giá trị được chỉ định được tuần tự hóa dưới dạng JSON.
PostAsXmlAsync Gửi yêu cầu POST như một hoạt động không đồng bộ đến Uri được chỉ định với giá trị được chỉ định được tuần tự hóa dưới dạng XML.
PutAsync Gửi yêu cầu PUT đến Uri được chỉ định như một hoạt động không đồng bộ.
PutAsJsonAsync Gửi yêu cầu PUT dưới dạng hoạt động không đồng bộ đến Uri được chỉ định với giá trị được chỉ định được tuần tự hóa dưới dạng JSON.
PutAsXmlAsync Gửi yêu cầu PUT như một hoạt động không đồng bộ đến Uri được chỉ định với giá trị được chỉ định được tuần tự hóa dưới dạng XML.
DeleteAsync Gửi yêu cầu DELETEvđến Uri được chỉ định như một hoạt động không đồng bộ.

Truy cập MSDN để biết tất cả các thành viên của HttpClientHttpClientExtension