首页 > 解决方案 > Dio(Dart 的 Http 客户端)获取请求不适用于拦截器

问题描述

实际上我想在我的项目中使用 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);
 }
}```

标签: apiflutterdarthttpclient

解决方案


更新

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 是必要的


推荐阅读