در این پست از وبسایت پرووید در رابطه با استفاده کردن از ASP.NET Web API با استفاده از HttpClient در دات نت  صحبت خواهیم کرد.

در این قسمت از این آموزش از وب سایت پرووید در رابطه با استفاده کردن از Web API در دات نت فریم ورک با استفاده از کلاس HttpClient صحبت خواهیم کرد. در دات نت فریم ورک ورژن 2 کلاسی تحت عنوان WebClient وجود داشت که با استفاده از آن می توانستیم با یک وب سرور و با استفاده از پروتکل HTTP ارتباط برقرار کنیم. اما این کلاس محدودیت‌ هایی را نیز داشت. به همین دلیل در ورژن 4.5 از دات نت فریم ورک کلاسی تحت عنوان HttpClient مطرح شد که برخی از محدودیت‌ های کلاس WebClient را از بین برد.

بسته ی آموزش ویدئویی ساخت Web API در ASP.NET Core 2.0

از شما دعوت می کنیم که از بسته ی آموزش ویدئویی ساخت Web API در ASP.NET Core 2.0 دیدن کنید.

با استفاده از کلاس HttpClient می توانید به راحتی به Web API دسترسی پیدا کنید. ما در این قسمت از این کلاس در یک Console Application استفاده خواهیم کرد و داده‌ هایی را به Web API ارسال و داده‌ هایی را از آن دریافت می‌کنیم. دقت که Web API به صورت Local در یک IIS Server میزبانی و یا اصطلاحاً Host شده است. علاوه بر یک Console Application شما میتوانید از کلاس HttpClient در دیگر اپلیکیشن‌ های دات نت فریم ورک از قبیل ASP.NET MVC و Windows Forms Application و غیره نیز استفاده کنید. خب در ادامه نحوه ارتباط برقرار کردن با Web API با استفاده از کلاس HttpClient را از درون یک Console Application خواهیم دید.

به این منظور در ابتدا Web API ای که در قسمت های قبل تولید شده است را دوباره مرور می‌کنیم. کد زیر این Web API را نشان می‌دهد.

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();
        }
    }
}

در ابتدا باید یک Console Application را در ویژوال استودیو ایجاد کرده و سپس با NuGet Package Manager اقدام به نصب کردن HttpClient می کنیم. به این منظور از گزینه Package Manager Console که در منوی Tools قرار دارد را باز کرده و سپس دستور زیر را اجرا کنید.

Install-Package Microsoft.AspNet.WebApi.Client

در ادامه نیاز به ایجاد کردن یک کلاس Student داریم که با استفاده از بتوانیم داده‌ هایی را به Web API ارسال و یا داده‌ هایی را از آن دریافت کنیم. به عبارت دیگر کلاس Web API نقش Model را در برنامه ما ایفا می کند. تعریف این کلاس در قسمت زیر آمده است.

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

ارسال کردن یک HTTP Get request

مثالی که در ادامه می بینید نحوه ارسال کردن یک HTTP Get request را به Web API ای که در قسمت های قبلی از این آموزش ایجاد کرده ایم را به شما نشان می دهد.

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&lt;Student[]&gt;();
                    readTask.Wait();

                    var students = readTask.Result;

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

همانطور که در کد بالا مشاهده می کنید ابتدا یک Object از کلاس HttpClient ایجاد شده است و سپس Base Address مربوط به Web API را به آن اختصاص داده ایم. در ادامه از متد GetAsync استفاده کرده‌ایم تا بتوانیم یک HTTP Get request را به URL مورد نظرمان ارسال کنیم. دقت کنید که متد GetAsync به صورت Asynchronous کار می‌کند و در واقع یک Task را return می‌ کند. به همین منظور از Task.Wait استفاده کرده ایم که تا زمان اجرای تمام و کمال GetAsync همه چیز متوقف و یا اصطلاحاً Suspend بشود. در این رابطه می توانید در بسته ی آموزش ویدئویی برنامه نویسی چند نخی در سی شارپاطلاعات بیشتری را به دست آورید.

بسته ی آموزش ویدئویی پیاده سازی Web API های Async در ASP.NET Core

از شما دعوت می کنیم که از بسته ی آموزش ویدئویی پیاده سازی Web API های Async در ASP.NET Core دیدن کنید.

پس از کامل شدن عملیات GetAsync می‌توانیم در قالب یک نتیجه و یا Result نتیجه کار را ببینیم. به منظور به دست آوردن نتیجه عملیات GetAsync از Task.Result که از نوع کلاس HttpResponseMessage می باشد استفاده می کنیم. حال می توانید IsSuccessStatusCode را چک کرده که آیا این عملیات موفقیت آمیز بوده است یا خیر. ضمناً با استفاده از متد ReadAsAsync محتویات این Result را نیز بخوانید. در نتیجه شما توانستید با استفاده از یک Object از کلاس HttpClient یک HTTP Get request را به Web API ارسال کنید.

ارسال یک HTTP Post request

به طور مشابه می توانید یک HTTP Post request را با استفاده از متد PostAsAsync از با استفاده از کلاس HttpClient ارسال کنید. کدی که در قسمت زیر مشاهده می کنید نحوه ارسال کردن یک HTTP Post request را به Web API نشان می‌ دهد.

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&lt;Student&gt;("student", student);
            postTask.Wait();

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

                var readTask = result.Content.ReadAsAsync&lt;Student&gt;();
                readTask.Wait();

                var insertedStudent = readTask.Result;

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

در این کد یک شی از کلاس Student ایجاد شده و در قالب JSON به سمت Web API ارسال می گردد و نهایتاً response دریافت می‌شود. جدولی که در قسمت زیر می بینید تمامی متدهای کلاس HttpClient به منظور ارسال HTTP request های مختلف به Web API را به ما نشان می‌دهد.

امیدواریم که این آموزش از وبسایت پرووید نیز مورد توجه تمامی دوستان عزیز قرار گرفته باشد. از شما دعوت می‌کنیم که از دیگر آموزش های ما در رابطه با Web API استفاده کنید. لیست کامل این آموزش ها را می توانید در پست مربوط به آموزش ASP.NET Web API مشاهده کنید.

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *