Flutter中如何解决Dio请求返回302状态码问题
处理Flutter Dio请求返回302状态码的方案
你已经通过followRedirects: false关闭了Dio的自动重定向,同时validateStatus: (status) => status! < 500让302不会被判定为请求错误,接下来可以按以下步骤手动处理302重定向:
1. 获取重定向目标地址
当请求返回302时,重定向的目标地址会放在响应头的location字段中,你可以直接从response.headers提取:
Response response = await dio.get(targetUrl, options: yourOptions); if (response.statusCode == 302) { String? redirectUrl = response.headers.value('location'); if (redirectUrl != null) { // 执行后续重定向逻辑 } }
2. 处理相对路径的重定向地址
如果location返回的是相对路径(比如/api/new-endpoint),需要拼接原请求的域名和协议,转换为绝对地址:
Uri originalUri = Uri.parse(targetUrl); Uri redirectUri = originalUri.resolve(redirectUrl!); String absoluteRedirectUrl = redirectUri.toString();
3. 携带Cookie维持会话
302响应通常会附带Set-Cookie头,需要将这些Cookie传递给后续的重定向请求,保证会话状态一致:
// 提取302响应中的Cookie List<String>? cookies = response.headers['set-cookie']; Options redirectOptions = Options( headers: { if (cookies != null) 'Cookie': cookies.join('; '), // 保留原请求的其他请求头 ...yourOptions.headers ?? {}, }, followRedirects: false, validateStatus: (status) => status! < 500, ); // 发起重定向请求 Response redirectResponse = await dio.get(absoluteRedirectUrl, options: redirectOptions);
4. 封装自动重定向逻辑(可选)
如果需要多次处理302,可以封装工具函数,限制最大重定向次数避免无限循环:
Future<Response> requestWithRedirect(Dio dio, String url, Options options, {int maxRedirects = 3}) async { Response response = await dio.get(url, options: options); int redirectCount = 0; while (response.statusCode == 302 && redirectCount < maxRedirects) { String? redirectUrl = response.headers.value('location'); if (redirectUrl == null) break; Uri originalUri = Uri.parse(url); Uri redirectUri = originalUri.resolve(redirectUrl); url = redirectUri.toString(); // 携带Cookie List<String>? cookies = response.headers['set-cookie']; options.headers?.addAll({ if (cookies != null) 'Cookie': cookies.join('; '), }); response = await dio.get(url, options: options); redirectCount++; } return response; }
内容的提问来源于stack exchange,提问作者MARWA MOSTAFA
相关产品推荐
相关产品推荐

