You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:54:27