Dart RedirectInfo
最后修改于 2025 年 4 月 4 日
Dart 中的 RedirectInfo
类提供了有关网络请求期间发生的 HTTP 重定向的信息。它是 Dart 的 dart:io
库的一部分,用于服务器端和命令行应用程序。
RedirectInfo 包含有关重定向响应的详细信息,包括状态码、位置和方法。它有助于跟踪和分析 HTTP 通信中的重定向链。
基本定义
RedirectInfo
是一个表示单个 HTTP 重定向的不可变类。它通常从 HttpClientResponse 的 redirects 属性中获取。
关键属性包括 statusCode、method 和 location。这些有助于理解和处理 HTTP 客户端和服务器中的重定向。
RedirectInfo 基本用法
此示例展示了如何从 HTTP 客户端响应中访问 RedirectInfo。
main.dart
import 'dart:io'; void main() async { var client = HttpClient(); try { var request = await client.getUrl(Uri.parse('http://example.org')); var response = await request.close(); if (response.redirects.isNotEmpty) { var redirect = response.redirects.first; print('Redirected to: ${redirect.location}'); print('Status code: ${redirect.statusCode}'); print('Method: ${redirect.method}'); } } finally { client.close(); } }
我们创建一个 HTTP 客户端并检查响应中的重定向。如果发生任何重定向,将打印第一个重定向的详细信息。
$ dart main.dart Redirected to: https://example.org/ Status code: 301 Method: GET
分析重定向链
此示例演示了检查完整的重定向链。
main.dart
import 'dart:io'; void main() async { var client = HttpClient(); try { var request = await client.getUrl(Uri.parse('http://google.com')); var response = await request.close(); print('Final URL: ${response.redirects.last.location}'); print('Redirect chain length: ${response.redirects.length}'); for (var redirect in response.redirects) { print('${redirect.statusCode} ${redirect.method} -> ${redirect.location}'); } } finally { client.close(); } }
我们打印链中的每个重定向及其状态码和方法。这有助于理解复杂的重定向序列。
$ dart main.dart Final URL: https://www.google.com/ Redirect chain length: 2 301 GET -> https://google.com/ 301 GET -> https://www.google.com/
手动跟踪重定向
此示例展示了使用 RedirectInfo 手动跟踪重定向。
main.dart
import 'dart:io'; void main() async { var client = HttpClient(); var url = Uri.parse('http://example.org'); var maxRedirects = 5; var currentRedirect = 0; try { while (currentRedirect < maxRedirects) { var request = await client.getUrl(url); var response = await request.close(); if (response.redirects.isEmpty) { print('Final destination: $url'); break; } var redirect = response.redirects.first; print('Redirect $currentRedirect: ${redirect.location}'); url = Uri.parse(redirect.location.toString()); currentRedirect++; } } finally { client.close(); } }
我们将重定向手动跟踪到一个最大限制。这演示了如何在需要时实现自定义重定向逻辑。
$ dart main.dart Redirect 0: https://example.org/ Final destination: https://example.org/
处理不同的重定向类型
此示例展示了如何处理各种重定向状态码。
main.dart
import 'dart:io'; void main() async { var client = HttpClient(); try { var request = await client.getUrl(Uri.parse('http://test.com/temporary')); var response = await request.close(); if (response.redirects.isNotEmpty) { var redirect = response.redirects.first; switch (redirect.statusCode) { case HttpStatus.movedPermanently: print('Permanent redirect to ${redirect.location}'); break; case HttpStatus.found: print('Temporary redirect to ${redirect.location}'); break; case HttpStatus.seeOther: print('See other (change method to GET) to ${redirect.location}'); break; default: print('Unknown redirect type: ${redirect.statusCode}'); } } } finally { client.close(); } }
我们检查状态码以确定重定向类型。不同的 HTTP 状态码表示不同的重定向语义。
$ dart main.dart Temporary redirect to http://test.com/new-location
创建自定义重定向策略
此示例演示了实现自定义重定向策略。
main.dart
import 'dart:io'; class SecureRedirectPolicy { bool allowRedirect(RedirectInfo redirect) { if (redirect.location.scheme != 'https') { print('Blocking insecure redirect to ${redirect.location}'); return false; } return true; } } void main() async { var client = HttpClient(); var policy = SecureRedirectPolicy(); try { client.maxRedirects = 10; client.autoUncompress = false; var request = await client.getUrl(Uri.parse('http://bank.com/login')); var response = await request.close(); for (var redirect in response.redirects) { if (!policy.allowRedirect(redirect)) { print('Aborting due to redirect policy violation'); return; } } print('Successfully followed redirects to secure destination'); } finally { client.close(); } }
我们实现了一个安全策略,该策略会阻止重定向到非 HTTPS URL。这展示了如何使用 RedirectInfo 进行安全验证。
$ dart main.dart Blocking insecure redirect to http://bank.com/login Aborting due to redirect policy violation
最佳实践
- 限制重定向: 设置 maxRedirects 以防止无限循环
- 验证 URL: 检查重定向位置以确保安全
- 保留方法: 正确处理 307/308 状态码
- 记录重定向: 记录重定向链以进行调试
- 处理错误: 为格式错误的重定向位置做好准备
来源
本教程通过实际示例介绍了 Dart 的 RedirectInfo 类,展示了重定向处理、链分析和自定义安全策略。
作者
列出 所有 Dart 教程。