es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Encabezado fijo y definición de URL base para ser utilizados en todo el programa con Restsharp: Encabezado fijo: Definición de base URL:

Tengo algunas operaciones de “compartición” para HttpClient, quiero aplicar estas operaciones en el cliente RestSharp.

Estoy compartiendo muestras de códigos de HttpClient.

  1. Inicio (Startup)

El proceso de registrar el servicio como un contenedor en el archivo de inicio.
Como aquí, pude suscribirme al contenedor DI y personalizar HttpClient, no tuve que definir la baseapiurl una y otra vez en todo el servicio. ¿Es posible implementar este método en RestSharp?

services.AddHttpClient<icatalogservice, catalogservice="">(opt =>
{
    opt.BaseAddress = new Uri($"{serviceApiSettings.GatewayBaseUri}/{serviceApiSettings.Catalog.Path}");
}).AddHttpMessageHandler<clientcredentialtokenhandler>();
  1. ClientCredentialTokenHandler.cs
public class ClientCredentialTokenHandler : DelegatingHandler
{
    private readonly IClientCredentialTokenService _clientCredentialTokenService;

    public ClientCredentialTokenHandler(IClientCredentialTokenService clientCredentialTokenService)
    {
        _clientCredentialTokenService = clientCredentialTokenService;
    }

    protected override async Task<httpresponsemessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", await _clientCredentialTokenService.GetToken());

        var response = await base.SendAsync(request, cancellationToken);

        if (response.StatusCode == System.Net.HttpStatusCode.Unauthorized)
        {
            throw new UnAuthorizeException();
        }
        return response;
    }
}

Esta estructura me ahorra duplicación de código al realizar solicitudes a servicios externos desde cada HttpClient. ¿Es posible una solución similar para RestClient?</icatalogservice,>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, es posible implementar una solución similar para RestClient. RestSharp también proporciona formas de personalizar el cliente HTTP y agregar encabezados globales u otras operaciones comunes.

    Una forma de lograr esto es creando un HttpClient personalizado que herede de RestClient y registrándolo como singleton en el método ConfigureServices en el archivo de inicio. Aquí hay un ejemplo de fragmento de código:

    services.AddSingleton<irestclient>(s =>
    {
      var client = new RestClient(configuration["BaseApiUrl"]);
      client.AddDefaultHeader("Authorization", "Bearer " + tokenService.GetTokenAsync().Result);
      // aquí se pueden agregar otras operaciones comunes
      return client;
    });
    

    Con este código, puedes inyectar IRestClient en tus servicios y todas las solicitudes de RestSharp compartirán la misma instancia del cliente con encabezados y operaciones comunes ya configurados.

Comments are closed.