程序问答   发布时间:2022-05-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Dio 拦截器在同一个回调中不处理第一个请求,只有后续调用 代码点击登录按钮的控制台第一次点击获取个人资料按钮时的控制台在随后点击获取个人资料按钮时的控制台大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Dio 拦截器在同一个回调中不处理第一个请求,只有后续调用 代码点击登录按钮的控制台第一次点击获取个人资料按钮时的控制台在随后点击获取个人资料按钮时的控制台?

开发过程中遇到Dio 拦截器在同一个回调中不处理第一个请求,只有后续调用 代码点击登录按钮的控制台第一次点击获取个人资料按钮时的控制台在随后点击获取个人资料按钮时的控制台的问题如何解决?下面主要结合日常开发的经验,给出你关于Dio 拦截器在同一个回调中不处理第一个请求,只有后续调用 代码点击登录按钮的控制台第一次点击获取个人资料按钮时的控制台在随后点击获取个人资料按钮时的控制台的解决方法建议,希望对你解决Dio 拦截器在同一个回调中不处理第一个请求,只有后续调用 代码点击登录按钮的控制台第一次点击获取个人资料按钮时的控制台在随后点击获取个人资料按钮时的控制台有所启发或帮助;

我正在测试 dio 并尝试添加一个拦截器来简单地向未来的请求添加一个令牌,但得到了一个我似乎无法修复的奇怪结果。作为测试,我只有一个 2 个按钮。单击一个按钮应该让我登录并将令牌添加到拦截器,第二个按钮请求身份验证配置文件数据。出于某种原因,单击登录按钮我可以正常登录,但在单击第二个按钮访问身份验证配置文件数据时收到 403 ForbIDden(即使我在添加拦截器后请求配置文件数据)。奇怪的是,当我再次单击第二个按钮(不更改任何代码甚至热重新加载)时,一切正常,并且打印出身份验证配置文件数据。每次我热重启时,我都会回到同样的问题,我对身份验证配置文件数据的第一个请求有 403,但后续请求工作正常。几个小时以来,我一直试图弄清楚发生了什么,但无法理解出了什么问题。请帮忙。谢谢你。 (后端由 django 处理,但问题不存在,因为 API 可与其他框架一起使用,甚至在 dio 中在后续按钮按下时也能正常工作,只是不是第一个)

代码


class HomeScreen extends StatefulWidget {
  @overrIDe
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  dio session = dio(
    BaSEOptions(
      connectTimeout: 30000,baseUrl: 'http://127.0.0.1:8000',responseType: ResponseType.Json,ContentType: ContentType.Json.toString(),),);
  @overrIDe
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: column(
          mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.center,children: [
            Raisedbutton(
                child: Text('Log In'),onpressed: () async {
                  print('starTing');
                  var res = await session.post('/auth/login/',data: {'username': 'tester','password': 'tester'});
                  print(res.data);
                  session.interceptors.clear();
                  session.interceptors.addAll([
                    InterceptorsWrapper(
                      onrequest: (requestoptions requestoptions) {
                        session.interceptors.requestLock.lock();
                        String token = res.data['key'];
                        if (token != null) {
                          session.options.headers[httpheaders.authorizationheader] =
                              ‘token $token’;
                        }
                        session.interceptors.requestLock.unlock();
                        return requestoptions;
                      },onError: (E) => print(e.messagE),]);
                  print(session.interceptors);
                }),Raisedbutton(
                child: Text('Get Profile'),onpressed: () async {
                  session.get('/API/auth/').then((res) => print(res.data));
                }),],);
  }
}

点击登录按钮的控制台

Restarted application in 11,586ms.
Flutter: starTing
Flutter: {key: 745c0a53112e61d54bea5ea725f7fa92e3a2cdbb}
Flutter: [Instance of 'InterceptorsWrapper']

第一次点击获取个人资料按钮时的控制台

Flutter: http status error [403]
[VERBOSE-2:ui_dart_state.cc(177)] Unhandled Exception: dioError [dioErrorType.RESPONSE]: http status error [403]
#0      diomixin._request._errorInterceptorWrapper.<anonymous closure>.<anonymous closure>.<anonymous closure>
package:dio/src/dio.dart:870
#1      _rootRunUnary (dart:async/zone.dart:1198:47)
#2      _CustomZone.runUnary (dart:async/zone.dart:1100:19)
#3      _FutureListener.handleValue (dart:async/future_impl.dart:143:18)
#4      Future._propagatetoListeners.handleValueCallBACk (dart:async/future_impl.dart:696:45)
#5      Future._propagatetoListeners (dart:async/future_impl.dart:725:32)
#6      Future._completeWithValue (dart:async/future_impl.dart:529:5)
#7      Future._asyncCompleteWithValue.<anonymous closure> (dart:async/future_impl.dart:567:7)
#8      _rootRun (dart:async/zone.dart:1190:13)
#9      _CustomZone.run (dart:async/zone.dart:1093:19)
#10     _CustomZone.runGuarded (dart:async/zone.dart:997:7)
#11     _CustomZone.bindCallBACkGuarded.<anonymous closure> (dart:async/zon<…>

在随后点击获取个人资料按钮时的控制台

Flutter: {ID: 3,username: tester,first_name:,last_name:,email: tester@tester.com}

解决方法

又过了 5 个小时,终于找到了问题所在。

session.options.headers[httpHeaders.authorizationHeader] = 'token ' + token;

应该

requestOptions.headers[httpHeaders.authorizationHeader] = 'token ' + token;

大佬总结

以上是大佬教程为你收集整理的Dio 拦截器在同一个回调中不处理第一个请求,只有后续调用 代码点击登录按钮的控制台第一次点击获取个人资料按钮时的控制台在随后点击获取个人资料按钮时的控制台全部内容,希望文章能够帮你解决Dio 拦截器在同一个回调中不处理第一个请求,只有后续调用 代码点击登录按钮的控制台第一次点击获取个人资料按钮时的控制台在随后点击获取个人资料按钮时的控制台所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: