Flutter如何解析短链接获取对应的原始链接
Flutter 实现短链接展开获取原始长链接
实现原理
和给出的PHP代码逻辑完全一致:短链接服务收到请求后会返回301/302/307/308类的重定向状态码,真实目标地址存放在响应头的Location字段中。发起HTTP请求时禁止客户端自动跟随重定向,读取响应头里的Location值即可拿到跳转目标,遇到多级跳转的场景循环处理直到拿到非重定向的最终地址即可。
具体实现步骤
第一步:添加网络请求依赖
在项目的pubspec.yaml文件中添加官方维护的http库依赖:dependencies: flutter: sdk: flutter http: ^1.1.0 # 使用当前最新稳定版本即可配置完成后执行
flutter pub get拉取依赖。第二步:编写短链接展开方法
优先使用HEAD请求(相比GET更省流量,不需要加载响应体),关闭自动重定向配置,循环解析重定向地址直到拿到最终链接,同时做好异常捕获和死循环防护:import 'package:http/http.dart' as http; /// 传入短链接,返回展开后的原始长链接 /// [maxRedirectTimes] 支持配置最大允许重定向次数,防止死循环 Future<String?> expandShortUrl( String shortUrl, { int maxRedirectTimes = 5, }) async { var currentUrl = Uri.parse(shortUrl); var redirectCount = 0; final client = http.Client(); try { while (redirectCount < maxRedirectTimes) { // 构造HEAD请求,关闭自动跟随重定向 final request = http.Request('HEAD', currentUrl); request.followRedirects = false; // 若遇到校验UA的短链,可在这里补充请求头模拟浏览器访问 // request.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'; final streamedResponse = await client.send(request); final response = await http.Response.fromStream(streamedResponse); // 判断是否为重定向状态码 if ([301, 302, 303, 307, 308].contains(response.statusCode)) { final location = response.headers['location']; if (location == null || location.isEmpty) break; // 兼容相对路径格式的重定向地址 currentUrl = currentUrl.resolve(location); redirectCount++; } else { // 非重定向状态,返回最终地址 return currentUrl.toString(); } } // 超过最大重定向次数返回最后一次解析到的地址 return currentUrl.toString(); } catch (e) { // 可根据自身业务需求自定义异常处理逻辑 print('短链接解析异常: $e'); return null; } finally { client.close(); } }第三步:调用示例
// 测试调用,支持解析shorturl.at类的常见短链接 void testExpandUrl() async { final realUrl = await expandShortUrl('https://shorturl.at/cpqCE'); print('原始链接为: $realUrl'); }
注意事项
- 部分短链接服务会校验请求头的User-Agent、Referer字段,若出现解析失败的情况,可以在构造Request对象时补上常规浏览器的请求头,模拟正常用户访问。
- 安卓端需在
AndroidManifest.xml中声明网络权限:<uses-permission android:name="android.permission.INTERNET" />;iOS端如果需要访问HTTP协议的链接,要在Info.plist中配置NSAppTransportSecurity权限放开HTTP限制。 - 若不想引入第三方http依赖,也可以直接使用Dart内置的
HttpClient实现,核心逻辑一致,仅API调用方式有区别。
附参考PHP实现逻辑:通过
get_headers获取请求响应头,直接返回Location字段对应的跳转地址。function expandShortUrl($url) { $headers = get_headers($url, 1); return $headers['Location']; } // will echo https://deluxeblogtips.com echo expandShortUrl($url);
内容的提问来源于stack exchange,提问作者Sarmed MQ Berwari
相关产品推荐
相关产品推荐

