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.

Cómo atrapar y manejar correctamente errores en una solicitud Http de tipo “get” a la api de Facebook.

Estoy tratando de recibir un token de acceso de la API de gráficos de Facebook usando el código recibido de Facebook. Esta es mi primera vez trabajando con APIs en .NET CORE. El código parece funcionar bien, sin embargo, no estoy seguro si estoy manejando la respuesta y capturando las excepciones de la manera correcta. Aunque puedo usar TRY CATCH, aún no me siento muy cómodo con eso. Me gustaría hacer que este método sea lo más robusto posible.

Tu ayuda es muy apreciada.

Clase de Manejo

public class FacebookService : IFacebookService
{
    private readonly HttpClient _httpClient;
    private readonly IConfiguration configuration;

    public FacebookService(HttpClient httpClient, IConfiguration iConfig)
    {
        _httpClient = httpClient;
        configuration = iConfig;
    }

    public async Task<string> GetShortLiveToken(string code)
    {
        try
        {
            string appId = configuration.GetSection("FacebookApp").GetSection("AppID").Value;
            string appSecret = configuration.GetSection("FacebookApp").GetSection("AppSecret").Value;
            var getTokenUri = $"oauth/access_token?client_id={appId}&client_secret={appSecret}&code={code}&redirect_uri=https://localhost:44373/Home/HandleFbAccess";
            var response = await _httpClient.GetAsync(getTokenUri);
            if (response.IsSuccessStatusCode)
            {
                return await response.Content.ReadAsStringAsync();
            }
            else
            {
                return response.ReasonPhrase;
            }
        }
        catch(Exception ex)
        {
            throw ex;
        }

    }

    public async Task<string> GetLongLiveToken(string shortlivedtoken)
    {
        throw new NotImplementedException();
    }
}

Invocando el Método
csharp
public async Task<iactionresult> HandleFbAccess(string code, string granted_scopes)
{
try
{
var result = await _facebookService.GetShortLiveToken(code);
// más cosas por hacer aquí
// .....
return View("Index");
}
catch(Exception ex)
{
throw ex;
}
}

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Recomendaciones para manejar la API de Gráficos de Facebook en .NET CORE

    Aquí hay algunas recomendaciones para hacer que el código sea más robusto al manejar la API de Gráficos de Facebook utilizando C# y .NET CORE:

    1. Refactorización de la Clase FacebookService

    1.1 Lectura de la Configuración

    En lugar de usar .GetSection(), considere usar .GetValue() para obtener los valores del archivo de configuración appsettings.json:

    string appId = configuration.GetValue<string>("FacebookApp:AppId");
    string appSecret = configuration.GetValue<string>("FacebookApp:AppSecret");
    

    1.2 Verificación de Excepciones usando Try-Catch

    En lugar de volver a lanzar una excepción en el método, captúrela y devuelva un mensaje de error apropiado. Esto protege el código de nivel superior de conocer directamente los detalles de la excepción, centralizando así el manejo de excepciones en la clase de servicio.

    try
    {
        //......
    }
    catch (Exception ex)
    {
        return ex.Message;
    }
    

    1.3 Deserialización del Texto de Respuesta

    El texto de respuesta debe deserializarse en el objeto apropiado, no devolverse como una cadena. Aquí hay un ejemplo de deserialización de una respuesta JSON:

    // crear una clase que coincida con la estructura de la respuesta
    public class TokenResponse
    {
        public string access_token { get; set; }
        public long expires_in { get; set; }
    }
    
    // deserializar el contenido de la respuesta
    var tokenResponse = await response.Content.ReadAsAsync<tokenresponse>();
    return tokenResponse.access_token;
    

    2. Refactorización del método HandleFbAccess

    2.1 Verificación de Valores Nulos

    Considere verificar los valores nulos al invocar el método GetShortLiveToken:

    if (string.IsNullOrEmpty(code))
    {
        return BadRequest("El parámetro del código no puede ser nulo o vacío.");
    }
    
    var result = await _facebookService.GetShortLiveToken(code);
    

    2.2 Captura de Excepciones

    Utilice el manejo estructurado de excepciones para las llamadas al servicio. Esto le permitirá capturar excepciones específicas y devolver mensajes de error apropiados. Por ejemplo:

    try
    {
        var result = await _facebookService.GetShortLiveToken(code);
        // más cosas por hacer aquí
        //......
        return View("Index");
    }
    catch (HttpRequestException ex)
    {
        return BadRequest("Se produjo un error al comunicarse con Facebook. Por favor, inténtelo de nuevo más tarde.");
    }
    catch (Exception ex)
    {
        return BadRequest("Se produjo un error inesperado.");
    }
    

    Código Final

    Clase FacebookService actualizada:

    public class FacebookService : IFacebookService
    {
        private readonly HttpClient _httpClient;
        private readonly IConfiguration configuration;
    
        public FacebookService(HttpClient httpClient, IConfiguration configuration)
        {
            _httpClient = httpClient;
            this.configuration = configuration;
        }
    
        public async Task<string> GetShortLiveToken(string code)
        {
            try
            {
                string appId = configuration.GetValue<string>("FacebookApp:AppId");
                string appSecret = configuration.GetValue<string>("FacebookApp:AppSecret");
    
                var uri = $"/oauth/access_token?client_id={appId}&client_secret={appSecret}&code={code}&redirect_uri=https://localhost:44373/Home/HandleFbAccess";
                var response = await _httpClient.GetAsync(uri);
                if (response.IsSuccessStatusCode)
                {
                    var tokenResponse = await response.Content.ReadAsAsync<tokenresponse>();
                    return tokenResponse.access_token;
                }
                else
                {
                    return response.ReasonPhrase;
                }
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }
    
        public async Task<string> GetLongLiveToken(string shortlivedtoken)
        {
            throw new NotImplementedException();
        }
    
        private class TokenResponse
        {
            public string access_token { get; set; }
            public long expires_in { get; set; }
        }
    }
    

    Método HandleFbAccess actualizado:
    “`csharp
    public async Task HandleFbAccess(string code)
    {
    // verificar si el código es nulo o vacío
    if (string.IsNullOrEmpty(code))
    {
    return BadRequest(“El parámetro del código no puede ser nulo o vacío.”);
    }

    try
    {
        var result = await _facebookService.GetShortLiveToken(code);
        // más cosas por hacer aquí
        //......
        return View("Index");
    }
    catch (HttpRequestException ex)
    {
        return BadRequest("Se produjo un error al comunicarse con Facebook. Por favor, inténtelo de nuevo más tarde.");
    }
    catch (Exception ex)
    {
        return BadRequest("Se produjo un error inesperado.");
    }
    

    }
    “`

Comments are closed.