Estoy de acuerdo con la respuesta de TheWhiteRabbit, pero si tiene muchas llamadas usando HttpClient, el código parece un poco repetitivo en mi opinión.
Creo que hay 2 formas de mejorar un poco la respuesta.
Cree una clase auxiliar para crear el cliente:
public static class ClientHelper
{
// Basic auth
public static HttpClient GetClient(string username,string password)
{
var authValue = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{password}")));
var client = new HttpClient(){
DefaultRequestHeaders = { Authorization = authValue}
//Set some other client defaults like timeout / BaseAddress
};
return client;
}
// Auth with bearer token
public static HttpClient GetClient(string token)
{
var authValue = new AuthenticationHeaderValue("Bearer", token);
var client = new HttpClient(){
DefaultRequestHeaders = { Authorization = authValue}
//Set some other client defaults like timeout / BaseAddress
};
return client;
}
}
Uso:
using(var client = ClientHelper.GetClient(username,password))
{
//Perform some http call
}
using(var client = ClientHelper.GetClient(token))
{
//Perform some http call
}
Crea un método de extensión:
No gana un premio de belleza pero funciona muy bien :)
public static class HttpClientExtentions
{
public static AuthenticationHeaderValue ToAuthHeaderValue(this string username, string password)
{
return new AuthenticationHeaderValue("Basic",
Convert.ToBase64String(
System.Text.Encoding.ASCII.GetBytes(
$"{username}:{password}")));
}
}
Uso:
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization = _username.ToAuthHeaderValue(_password);
}
Nuevamente, creo que las 2 opciones anteriores hacen que el cliente que usa la declaración sea un poco menos repetitivo. Tenga en cuenta que es una buena práctica reutilizar el HttpClient si está haciendo varias llamadas http, pero creo que está un poco fuera de alcance para esta pregunta.