如何正确捕获和处理对 Facebook api 的 Http 获取请求中的错误

Posted

技术标签:

【中文标题】如何正确捕获和处理对 Facebook api 的 Http 获取请求中的错误【英文标题】:How to correctly catch and handle errors in Http get request to Facebook api 【发布时间】:2021-12-13 09:36:46 【问题描述】:

我正在尝试使用从 Facebook 接收到的代码从 Facebook 的图形 API 接收访问令牌。这是我第一次在 .NET CORE 中使用 API。代码似乎工作正常,但我不确定我是否以正确的方式处理响应和捕获异常。虽然我可以用 TRY CATCH 还是觉得不是很舒服。我想让这个方法尽可能的健壮。

非常感谢您的帮助。

处理类

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();
        


调用方法

public async Task<IActionResult> HandleFbAccess(string code, string granted_scopes)

    try
    
        var result = await _facebookService.GetShortLiveToken(code);
        // more things to do here
        //.....
        return View("Index");

    
    catch(Exception ex)
    
        throw ex;
    
    

【问题讨论】:

仅供参考:throw ex; 几乎不是您想要使用的东西。此外,使用 try-catch 只是为了重新抛出而没有任何逻辑(甚至没有记录!)是没有意义的,只需完全删除 try-catch。但是,Controller 操作不应引发异常,而应返回内部服务器错误 对我来说,你的代码只做了一个发送http请求和接收响应的过程,不用担心是否发生异常以及如何处理,你可以关注@987654324 @ 本身。 【参考方案1】:

trycatch(Exception ex)在你的代码突然出现异常时起作用,比如nullpointexception,但是你现在担心httpclient send request,你应该知道这个方法只能抛出这些异常,所有这些异常都与脸书 api。

我对您的方案的想法是在这里继续使用try catch,但是您需要根据catch中的异常类型设置操作并在此处编写自定义逻辑代码,以处理诸如404,400,503问题等http响应:

if (response.IsSuccessStatusCode)
     return await response.Content.ReadAsStringAsync();
else
    return response.ReasonPhrase;

【讨论】:

以上是关于如何正确捕获和处理对 Facebook api 的 Http 获取请求中的错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Facebook PHP SDK 3.0 正确处理会话和访问令牌?

从 CosmicMind-Material 捕获 API:相机预览不正确

@ControllerAdvice 未捕获 Rest API 异常

如何在 passport-facebook / Passport.js 中捕获 FacebookAuthorizationError?

如何使用 Facebook 登录 API 对 XMPP 用户进行身份验证?

Facebook Graph API和FQL就像照片一样都不正确吗?