如何重新发送多部分请求?

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

如果 API 调用收到状态代码 = 401,我将重试它,但是当第二次调用它时,我收到以下异常:

[![状态不佳][1]][1]

这是重试多部分请求的代码。我使用了 [http_interceptor][2] 包来重试 API 调用

interceptor.dart

    class AuthorizationInterceptor extends InterceptorContract {
      @override
      Future<BaseRequest> interceptRequest({required BaseRequest request}) async {
        final prefs = await SharedPreferences.getInstance();
    
        final extractData =
            json.decode(prefs.getString('userData')!) as Map<String, dynamic>;
    
        final Map<String, String> headers = Map.from(request.headers);
        headers['Authorization'] = await extractData['accessToken'];
        print(
            'this is from AuthorizationInterceptor: ${extractData['accessToken']}');
        // TODO: implement interceptRequest
    
        return request.copyWith(
          headers: headers,
        );
      }

重试.dart:


    class ExpiredTokenRetryPolicy extends RetryPolicy {
      BuildContext context;
      ExpiredTokenRetryPolicy(this.context);
      @override
      // TODO: implement maxRetryAttempts
      int get maxRetryAttempts => 2;
    
      @override
      Future<bool> shouldAttemptRetryOnResponse(BaseResponse response) async {
        if (response.statusCode == 401) {
          print('retry token started');
          //perform token refresh,get the new token and update it in the secure storage
    
          await Provider.of<Auth>(context, listen: false).restoreAccessToken();
          return true;
        }
        return false;
      }

我在我的小部件中使用拦截器,以下是我使用拦截器并使用重试策略的代码


    @override
      Widget build(BuildContext context) {
        var flutterFunctions = Provider.of<FlutterFunctions>(context);
    
        // print('this is from insert package${token.token}');
        ApiCalls repository = ApiCalls(
          client: InterceptedClient.build(
            retryPolicy: ExpiredTokenRetryPolicy(context),
            interceptors: [
              AuthorizationInterceptor(),
            ],
          ),
        );

following is my restore access token method

    Future<void> restoreAccessToken() async {
        print('restoreAccessToken started');
    
        //print(token);
        final url = '${Ninecabsapi().urlHost}${Ninecabsapi().login}/$sessionId';
    
        var response = await http.patch(
          Uri.parse(url),
          headers: {
            'Content-Type': 'application/json; charset=UTF-8',
            'Authorization': accessToken!
          },
          body: json.encode(
            {"refresh_token": refreshtoken},
          ),
        );
        var userDetails = json.decode(response.body);
    
        if (response.statusCode == 401) {
          print(userDetails['messages']);
        }
    
        sessionId = userDetails['data']['session_id'];
        accessToken = userDetails['data']['access_token'];
        accessTokenExpiryDate = DateTime.now().add(
          Duration(seconds: userDetails['data']['access_token_expiry']),
        );
        refreshToken = userDetails['data']['refresh_token'];
        refreshTokenExpiryDate = DateTime.now().add(
          Duration(seconds: userDetails['data']['refresh_token_expiry']),
        );
        final userData = json.encode({
          'sessionId': sessionId,
          'refreshToken': refreshToken,
          'refreshExpiry': refreshTokenExpiryDate!.toIso8601String(),
          'accessToken': accessToken,
          'accessTokenExpiry': accessTokenExpiryDate!.toIso8601String()
        });
        //print(userDetails);
    
        notifyListeners();
        final prefs = await SharedPreferences.getInstance();
    
        prefs.setString('userData', userData);
        print("this is from restoreAcessToken :$userDetails");
        final extractData =
            json.decode(prefs.getString('userData')!) as Map<String, dynamic>;
        print('restore access token: ${extractData['accessToken']}');
        reset();
      }


  [1]: https://i.sstatic.net/0i0O3.png
  [2]: https://pub.dev/packages/http_interceptor
flutter httpinterceptor
1个回答
-1
投票

通常。您不得多次使用同一个 Stream/MultipartFile 进行写入。如果您需要重试发送到同一目的地,则每次重试时都必须使用新的 MultipartFile。

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