令牌刷新时自动注销

问题描述 投票:0回答:1

我这里有一个问题。我不明白如何让应用程序在令牌更改时自动注销。

以下是调用API的类:

class Api {
  static String? authToken;
  static String authPhoneNumber = '';

  static Future<Map<String, dynamic>> postData(
      {String? phoneNumber,
      String? token,
      bool auth = false,
      required String urlHttp}) async {
    late Map<String, dynamic> responseData;
    late Map<String, dynamic> kosong = {};
    Map<String, dynamic> dataMap = {};
    if (phoneNumber != null) {
      dataMap['phoneNumber'] = phoneNumber;
    }
    if (token != null) {
      dataMap['token'] = token;
    }
    final url = Uri.parse(urlHttp);
    final basicAuth = 'Bearer ${authToken ?? token}';

    await http
        .post(url,
            body: dataMap,
            headers: (auth)
                ? {'Authorization': basicAuth, 'X-Number-User': authPhoneNumber}
                : null)
        .timeout(
      const Duration(seconds: 12),
      onTimeout: () {
        return http.Response('Error', 500);
      },
    ).then((response) {
      try {
        responseData = json.decode(response.body);
        if (responseData.containsKey('token') && phoneNumber!.isNotEmpty) {
          authToken = responseData['token'];
          authPhoneNumber = phoneNumber;
        } 
      } catch (error) {
        print('error ${response.statusCode}');
      }
    });

    try {
      return responseData;
    } catch (error) {
      return kosong;
    }
  }
}

我尝试验证这一点,但我仍然很困惑。

if(responseData['code'] == 401) {
 //handle error
} 

有什么想法吗?

flutter dart token
1个回答
0
投票

最好针对不同的错误处理情况有异常模型。

class UnauthorizedUser implements Exception{}
class TimeoutException implements Exception{}

然后在出现异常时抛出这些异常。

if(responseData['code'] == 401) {
 throw UnauthorizedUser ()
}

然后在标语部分处理它们,例如,

rethrow
它们并在存储库层处理它们或在面对它们时执行一些逻辑,例如当未经授权使用时将其重定向到登录页面。

class Api {
  static String? authToken;
  static String authPhoneNumber = '';

  static Future<Map<String, dynamic>> postData(
      {String? phoneNumber,
      String? token,
      bool auth = false,
      required String urlHttp}) async {
    late Map<String, dynamic> responseData;
    late Map<String, dynamic> kosong = {};
    Map<String, dynamic> dataMap = {};
    if (phoneNumber != null) {
      dataMap['phoneNumber'] = phoneNumber;
    }
    if (token != null) {
      dataMap['token'] = token;
    }
    final url = Uri.parse(urlHttp);
    final basicAuth = 'Bearer ${authToken ?? token}';
    try {
   final response =  await http
        .post(url,
            body: dataMap,
            headers: (auth)
                ? {'Authorization': basicAuth, 'X-Number-User': authPhoneNumber}
                : null)
        .timeout(
      const Duration(seconds: 12),
      onTimeout: () {
        throw TimeoutException();
      },
    );

    responseData = json.decode(response.body);

    if (responseData.containsKey('token') && phoneNumber!.isNotEmpty) {
          authToken = responseData['token'];
          authPhoneNumber = phoneNumber;
        } 
    
    return responseData;
    } catch (error) {
      if(error is UnauthorizedUser ){
        // handle unauthorized
      }else if (error is TimeoutException ){
        // handle time out like retry again
      }
      return kosong;
    }
  }
}

最好使用await 和async 关键字而不是链接

Future
。要处理错误,请阅读这篇异步文章。 如果您正在创建一个 flutter 应用程序,最好熟悉应用程序的通用架构,例如this,它非常容易实现。

© www.soinside.com 2019 - 2024. All rights reserved.