Flutter使用块模式中的令牌调用API

qfe3c7zg  于 2023-02-16  发布在  Flutter
关注(0)|答案(1)|浏览(128)

我下面块教程,并试图使一个应用程序与登录,然后调用与令牌从登录API获取API。
在阅读了bloc教程之后,我认为在登录过程之后,令牌可能会存储在类似于身份验证存储库的东西中。
但是对于需要从登录中获得令牌的其余apis调用,api客户端如何获得令牌?
我想知道如果我把认证存储库注入到所有的API客户端,那会相当混乱。
那么,在块模式中有什么干净的方法来完成这个任务呢?
谢谢
我的结构

├── android
├── ios
├── lib
├── packages
│   ├── authentication_repository
│   └── login_api
│   └── other_apis
│   └── ...
└── test
sbtkgmzw

sbtkgmzw1#

我也在我的项目中使用了BLOC模式。作为我的选择,你可以构建基本网络类,你可以为API的其他部分注入授权令牌。我将展示我的代码示例。
这是获取令牌的头方法工作。

class BaseNetwork {
  final Client _client = Client();

  Future<Map<String, String>> getHeader({required String url}) async {
    String? token =
        await SharedPref.retrieveData(key: SharedPref.loginAuthToken);
    switch (url) {
      case END_POINT_SEND_DEVICE_INFO:
      case END_POINT_ID_LOGIN:
        return {'Authorization': StaticConstant.basicToken};
      default:
        return {'Authorization': '${StaticConstant.token} ${token!}'};
    }
  }

下面是调用getHeader()方法的API获取方法调用方法。

Future<ResponseObject> postRequest(
      {String baseURL = BASE_URL,
      required String endURL,
      required Map<String, dynamic> requestBody}) async {
    ResponseObject responseOb =
        ResponseObject(messageState: MessageState.loading);
    return await getHeader(url: endURL).then((headerValue) async {
      return await _client
          .post(Uri.parse(baseURL + endURL),
              body: requestBody, headers: headerValue)
          .then((res) {
       debugPrint('request body ---- $requestBody');
        if (res.statusCode == 200) {
          responseOb.data = res.body;
          responseOb.messageState = MessageState.data;
         debugPrint('successResponse ---- ${responseOb.data}');
          return responseOb;
        } else {
          responseOb.data = res.body;
          responseOb.messageState = MessageState.serverError;
         debugPrint('errorResponse ---- ${responseOb.data}');
          return responseOb;
        }
      });
    });
  }
}

**编辑:**通过从各自的API库中扩展基类,可以清楚地调用。

class LoginDataSource extends BaseNetwork {
  
  @override
  Future<ResponseObject> login(
      {required String loginEndPoint,
      required Map<String, dynamic> loginRequestBody}) async {
    ResponseObject responseObject =
        ResponseObject(messageState: MessageState.loading);
    return await postRequest(
            endURL: loginEndPoint, requestBody: loginRequestBody)
        .then(
      (ResponseObject value) {
        print("LoginValue === ${value.data}");
        if (value.messageState == MessageState.data) {
          Map<String, dynamic> loginRawData = json.decode(value.data!);
          if (filterVO.responseCode == 200) {
            responseObject.data = loginRawData;
            responseObject.messageState = MessageState.data;

/// Here you can save token that get from login api

            return responseObject;
          } else {
            responseObject.messageState = MessageState.requestError;
            responseObject.data = ErrorHandlingModel.fromJson(loginRawData);
            return responseObject;
          }
        } else {
          responseObject.messageState == MessageState.serverError;
          responseObject.data = value.data;
          return responseObject;
        }
      },
    );
  }
}

你是说像那样吗?如果不是,别介意。我已经尽我所能了。

相关问题