Flutter中使用Dio包通过GET请求传递API账号密码问题求助
解决Dio发送带Basic Auth的GET请求失败问题
你遇到的问题核心在于Dio与http包的默认行为差异,以及不必要的手动JSON解析操作。以下是修复后的代码和问题分析:
修复后的代码
import 'dart:convert'; import 'dart:io'; import 'package:dio/dio.dart'; import 'package:test/paymentmodel.dart'; class ApiService { final Dio dio; ApiService(this.dio); Future<List<PaymentMethodModel>> getall() async { String username = '11191082'; String password = 'dayfreetrial'; // 构建Basic Auth请求头 String basicAuth = 'Basic ${base64Encode(utf8.encode('$username:$password'))}'; var response = await dio.get( 'http://example-001-site1.atempurl.com/api/SalesInvoice/GetAllPayments', options: Options( headers: { HttpHeaders.authorizationHeader: basicAuth, }, ), ); // Dio已自动解析JSON,直接使用response.data List<dynamic> datat = response.data; List<PaymentMethodModel> storesList = []; for (int i = 0; i < datat.length; i++) { storesList.add(PaymentMethodModel.fromJson(datat[i])); } return storesList; } }
关键问题解析
自动JSON解析差异
http包返回的原始响应体需要手动调用jsonDecode解析,但Dio默认会根据响应的Content-Type自动解析JSON数据。你之前的代码中对response.data再次调用jsonDecode,会导致类型错误(因为response.data已经是解析后的List),这是请求失败的主要原因。规范请求头设置
使用HttpHeaders.authorizationHeader常量替代手动拼写'Authorization',可以避免拼写错误,同时符合Dart的编码规范。额外排查技巧
如果问题仍存在,可以添加日志拦截器查看实际发送的请求和响应详情,帮助定位问题:// 在创建Dio实例时添加日志拦截器 final dio = Dio()..interceptors.add(LogInterceptor(requestBody: true, responseBody: true));
更简洁的全局Auth配置
如果你的多个请求都需要Basic Auth,可以在Dio实例初始化时统一配置拦截器,避免重复代码:
final dio = Dio() ..interceptors.add(InterceptorsWrapper( onRequest: (options, handler) { String username = '11191082'; String password = 'dayfreetrial'; options.headers[HttpHeaders.authorizationHeader] = 'Basic ${base64Encode(utf8.encode('$username:$password'))}'; handler.next(options); }, ));
内容的提问来源于stack exchange,提问作者Abdelrahman saber
相关产品推荐
相关产品推荐

