api - Dio(Dart 的 Http 客户端)获取请求不适用于拦截器

标签 api flutter dart httpclient

实际上我想在我的项目中使用dio(Dart的Http客户端)来处理所有http请求,我检查了官方文档但无法申请。

使用包中的http客户端:http/http.dart,它工作得很好,但我想与Dio一起使用。任何人都可以检查并帮助我,为什么它不起作用。提前致谢!

import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:thunder_mobile/models/login_modal.dart';
import 'package:thunder_mobile/utils/all_shared_preference_helper.dart';
import 'package:thunder_mobile/utils/http.dart';
import 'package:dio/dio.dart';

class ApiHelper {
//  Dio _dio = new Dio();
var url = "http://5c9db1fd3be4e30014a7d3da.mockapi.io/";

final thunderBaseUrl = 'https://{domain}/api/v1/';

var headers = {'Content-Type': 'application/json'};

String token;

var sharedPref = new AllSharedPreferenceHelper();

var thunderHeaders = {
 'content-type': 'application/json',
 'x-requested-with': 'XMLHttpRequest',
};

var thunderImageHeaders = {
 'content-type': 'multipart/form-data',
 'x-requested-with': 'XMLHttpRequest',
};

final loginHeader = {'X-Requested-With': 'XMLHttpRequest'};

setApiHeader() {
 sharedPref.getLoginData().then((res) {
   LoginModel loginData = LoginModel.fromJson(json.decode(res));
   if (loginData.accessToken != null) {
     thunderHeaders['authorization'] = 'Bearer ' + loginData.accessToken;
     token = loginData.accessToken;
   }
 });
}

// --------------------http BASED (Working Successfully)--------------------------------------

Future getThunderRequest(apiUrl) async {
 await setApiHeader();
 final http.Response response =
     await http.get(thunderBaseUrl + apiUrl, headers: thunderHeaders);
 return response;
}

Future postThunderRequest(apiUrl, body) async {
 await setApiHeader();
 final response = await http.post(thunderBaseUrl + apiUrl,
     headers: thunderHeaders, body: json.encode(body.toJson()));
 return response;
}

// ----------------------DIO API'S(not Working)------------------------------------

Future getDioRequest(apiUrl) async {
 Dio dio = new Dio();
 dio.interceptors
     .add(InterceptorsWrapper(onRequest: (RequestOptions options) async {
   await setApiHeader();
   options.headers["token"] = thunderHeaders;
   return options;
 }));
 try {
   Response response = await Dio().get('https://{domain}/api/v1/master');
   print(response);
 } catch (e) {
   print(e);
 }
}```

最佳答案

已更新

dio = Dio();
dio.options.baseUrl = URL_API_PROD;
dio.interceptors.add(InterceptorsWrapper(
  onRequest: (Options option) async{
    //my function to recovery token
    await getToken().then((result) {
      token = result;
    });
    option.headers = {
      "Authorization": "Bearer $token"
    };
  }
));
//here i use the dio instance on constuctor and call the get verb to get the data
Future<List<Children>> getChildren() async {
    Response response = await dio.get('/v1/pessoa/alunosresponsavel');
    //here I map the json from response to my model(children)
    return (response.data['Dados'] as List).map((child)=> Children.fromJson(child)).toList();
  }

getToken.dart

import 'package:shared_preferences/shared_preferences.dart';

getToken() async {
  SharedPreferences preferences = await SharedPreferences.getInstance();
  String getToken = preferences.getString("LastToken");
  return getToken;
}

PS->依赖shared_preferences是必要的

关于api - Dio(Dart 的 Http 客户端)获取请求不适用于拦截器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57089525/

相关文章:

用于 Hotmail、Gmail 和 Yahoo 的 PHP API?

java - spring下载excel文件

flutter - 占行空间的一小部分

python - Flask 中的 API——返回 JSON 但 HTML 异常破坏了我的 JSON 客户端

javascript - 如何在 Rails 应用程序中导入 javascript?

firebase - flutter with firebase - 检测 url 字符串是图像(jpg)还是视频(avi)

Flutter:错误: 'await'只能在 'async'或 'async*'方法中使用。甚至认为该方法是异步的

Flutter Agora.io 调用屏幕

Dart:如何仅将特定类型变量的变量标识符名称转换为字符串

dart - 如何在 Dart 中制作 window.prompt?