Basit Bir Rest Api Client Geliştirelim 3
2023-05-12
Geliştirme vakti BaseAddress
özelliği, zaman aşımı süresini ayarlamak ve özelleştirilebilir bir
HttpMessageHandler
ekleyelim. Ayrıca, bu sınıf artık bir Authorization
header ı alabilsin.
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
public class MyHttpClient : IDisposable
{
private readonly HttpClient _client;
public MyHttpClient(HttpClient client, string baseAddress, TimeSpan? timeout = null, HttpMessageHandler handler = null)
{
_client = handler == null ? client : new HttpClient(handler);
_client.BaseAddress = new Uri(baseAddress);
if (timeout.HasValue)
{
_client.Timeout = timeout.Value;
}
}
private HttpRequestMessage CreateRequest(string uri, HttpMethod method, string jsonData = null, Dictionary<string, string> headers = null)
{
var request = new HttpRequestMessage(method, uri);
if (headers != null)
{
foreach (var header in headers)
{
request.Headers.Add(header.Key, header.Value);
}
}
if (!string.IsNullOrWhiteSpace(jsonData))
{
request.Content = new StringContent(jsonData, Encoding.UTF8, "application/json");
}
return request;
}
public async Task<HttpResponseMessage> SendRequestAsync(string uri, HttpMethod method, string jsonData = null, Dictionary<string, string> headers = null)
{
var request = CreateRequest(uri, method, jsonData, headers);
try
{
var response = await _client.SendAsync(request);
response.EnsureSuccessStatusCode();
return response;
}
catch (HttpRequestException ex)
{
throw new Exception($"{method} request to {uri} failed.", ex);
}
}
public async Task<string> GetAsync(string uri, Dictionary<string, string> headers = null) =>
(await SendRequestAsync(uri, HttpMethod.Get, null, headers)).Content.ReadAsStringAsync().Result;
public async Task<string> PostAsync(string uri, string jsonData, Dictionary<string, string> headers = null) =>
(await SendRequestAsync(uri, HttpMethod.Post, jsonData, headers)).Content.ReadAsStringAsync().Result;
public async Task<string> PutAsync(string uri, string jsonData, Dictionary<string, string> headers = null) =>
(await SendRequestAsync(uri, HttpMethod.Put, jsonData, headers)).Content.ReadAsStringAsync().Result;
public async Task<string> DeleteAsync(string uri, Dictionary<string, string> headers = null) =>
(await SendRequestAsync(uri, HttpMethod.Delete, null, headers)).Content.ReadAsStringAsync().Result;
public void SetAuthorizationHeader(string scheme, string parameter)
{
_client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(scheme, parameter);
}
public void Dispose()
{
_client?.Dispose();
}
}
SetAuthorizationHeader
yöntemi, Authorization
başlığını ayarlamak için kullanılabilir. Bu genellikle API’lerle etkileşim kurarken yararlıdır çünkü birçok API, isteklerin Authorization
başlığında bir bearer token taşımasını gerektirir.