نحوه استفاده از ASP.NET Core 2.0Web API با HttpClient

در این مقاله برای سوال مطرح شده ی "چگونگی استفاده از ASP.NET Core 2.0 Web API با استفاده از HttpClient" یک راه حل ارائه خواهیم داد و کد های آن را مرحله به مرحله ارائه خواهیم داد البته توجه کنید که این مقاله با مقاله ی قبل مرتبط است.

نحوه استفاده از ASP.NET Core 2.0Web API با HttpClient

مساله

چگونگی استفاده از ASP.NET Core 2.0 Web API با استفاده از HttpClient

راه حل

ما یک کتابخانه برای پوشش عملیات های HttpClient خواهیم نوشت من از الگوی builder برای این هدف استفاده خواهم کرد. یک کلاس با متد هایی برای ذخیره سازی بخش های HttpClient اضافه کنید.

public class HttpRequestBuilder  
  {  
      private HttpMethod method = null;  
      private string requestUri = "";  
      private HttpContent content = null;  
      private string bearerToken = "";  
      private string acceptHeader = "application/json";  
      private TimeSpan timeout = new TimeSpan(0, 0, 15);  
  
      public HttpRequestBuilder()  
      {  
      }  
  
      public HttpRequestBuilder AddMethod(HttpMethod method)  
      {  
          this.method = method;  
          return this;  
      }  
        
      public HttpRequestBuilder AddRequestUri(string requestUri)  
      {  
          this.requestUri = requestUri;  
          return this;  
      }  
  
      public HttpRequestBuilder AddContent(HttpContent content)  
      {  
          this.content = content;  
          return this;  
      }  
  
      public HttpRequestBuilder AddBearerToken(string bearerToken)  
      {  
          this.bearerToken = bearerToken;  
          return this;  
      }  
  
      public HttpRequestBuilder AddAcceptHeader(string acceptHeader)  
      {  
          this.acceptHeader = acceptHeader;  
          return this;  
      }  
  
      public HttpRequestBuilder AddTimeout(TimeSpan timeout)  
      {  
          this.timeout = timeout;  
          return this;  
      }  
 rest of code  

یک متد برای ارسال یک request با استفاده از HttpClient اضافه کنید و پاسخ را بگیرید.

public async Task<HttpResponseMessage> SendAsync()  
   {  
       // Check required arguments  
       EnsureArguments();  
  
       // Setup request  
       var request = new HttpRequestMessage  
       {  
           Method = this.method,  
           RequestUri = new Uri(this.requestUri)  
       };  
  
       if (this.content != null)  
           request.Content = this.content;  
  
       if (!string.IsNullOrEmpty(this.bearerToken))  
           request.Headers.Authorization =   
             new AuthenticationHeaderValue("Bearer", this.bearerToken);  
  
       request.Headers.Accept.Clear();  
       if (!string.IsNullOrEmpty(this.acceptHeader))  
           request.Headers.Accept.Add(  
              new MediaTypeWithQualityHeaderValue(this.acceptHeader));  
         
       // Setup client  
       var client = new System.Net.Http.HttpClient();  
       client.Timeout = this.timeout;  
         
       return await client.SendAsync(request);  
   }  

همچنین یک کلاس factory برای ساخت درخواست هایی برای GET, POST, PUT, PATCH و DELETE نیز اضافه خواهیم کرد.

public static class HttpRequestFactory  
  {  
      public static async Task<HttpResponseMessage> Get(string requestUri)  
      {  
          var builder = new HttpRequestBuilder()  
                              .AddMethod(HttpMethod.Get)  
                              .AddRequestUri(requestUri);  
  
          return await builder.SendAsync();  
      }  
  
      public static async Task<HttpResponseMessage> Post(  
         string requestUri, object value)  
      {  
          var builder = new HttpRequestBuilder()  
                              .AddMethod(HttpMethod.Post)  
                              .AddRequestUri(requestUri)  
                              .AddContent(new JsonContent(value)) ;  
  
          return await builder.SendAsync();  
      }  
  
      public static async Task<HttpResponseMessage> Put(  
         string requestUri, object value)  
      {  
          var builder = new HttpRequestBuilder()  
                              .AddMethod(HttpMethod.Put)  
                              .AddRequestUri(requestUri)  
                              .AddContent(new JsonContent(value));  
  
          return await builder.SendAsync();  
      }  
  
      public static async Task<HttpResponseMessage> Patch(  
         string requestUri, object value)  
      {  
          var builder = new HttpRequestBuilder()  
                              .AddMethod(new HttpMethod("PATCH"))  
                              .AddRequestUri(requestUri)  
                              .AddContent(new PatchContent(value));  
  
          return await builder.SendAsync();  
      }  
  
      public static async Task<HttpResponseMessage> Delete(string requestUri)  
      {  
          var builder = new HttpRequestBuilder()  
                              .AddMethod(HttpMethod.Delete)  
                              .AddRequestUri(requestUri);  
  
          return await builder.SendAsync();  
      }  
  }  

JsonContent, PatchContent و FileContent کلاس های سفارشی برای ساده سازی ارسال داده هستند.

public class JsonContent : StringContent  
 {  
     public JsonContent(object value)  
         : base (JsonConvert.SerializeObject(value), Encoding.UTF8,   
"application/json")  
     {  
     }  
  
     public JsonContent(object value, string mediaType)  
         : base(JsonConvert.SerializeObject(value), Encoding.UTF8, mediaType)  
     {  
     }  
 }  
  
 public class PatchContent : StringContent  
 {  
     public PatchContent(object value)  
         : base (JsonConvert.SerializeObject(value), Encoding.UTF8,   
                   "application/json-patch+json")  
     {  
     }  
 }  
  
 public class FileContent : MultipartFormDataContent  
 {  
     public FileContent(string filePath, string apiParamName)  
     {  
         var filestream = File.Open(filePath, FileMode.Open);  
         var filename = Path.GetFileName(filePath);  
  
         Add(new StreamContent(filestream), apiParamName, filename);  
     }  
 }  

سرانجام به تعدادی متد اضافی برای کمک به کار کردن با کلاس HttpResponseMessage نیاز داریم.

public static class HttpResponseExtensions  
 {  
     public static T ContentAsType<T>(this HttpResponseMessage response)  
     {  
         var data = response.Content.ReadAsStringAsync().Result;  
         return string.IsNullOrEmpty(data) ?   
                         default(T) :   
                         JsonConvert.DeserializeObject<T>(data);  
     }  
  
     public static string ContentAsJson(this HttpResponseMessage response)  
     {  
         var data = response.Content.ReadAsStringAsync().Result;  
         return JsonConvert.SerializeObject(data);  
     }  
  
     public static string ContentAsString(this HttpResponseMessage response)  
     {  
         return response.Content.ReadAsStringAsync().Result;  
     }  
 }  

می توانیم از کد بالا مانند کد زیر استفاده کنیم.

private static async Task GetList()  
 {  
     var requestUri = $"{baseUri}";  
     var response = await HttpRequestFactory.Get(requestUri);  
  
     Console.WriteLine($"Status: {response.StatusCode}");  
     var outputModel = response.ContentAsType<List<MovieOutputModel>>();  
     outputModel.ForEach(item =>   
                     Console.WriteLine("{0} - {1}", item.Id, item.Title));  
 }  

اینجا چگونگی نمایش client  نمونه نشان داده شده است.

توجه

در کد نمونه مثال هایی از انواع مختلف request ها نیز وجود دارد و از CRUD API های ساخته شده در پست قبل استفاده می کند. آن پروژه را دانلود کنید و API  را قبل از اجرای این کنسول نمونه اجرا کنید.

سورس کد : GitHub