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

求Flutter中curl --resolve的等效实现及本地DNS配置方案

在Flutter中实现类似curl --resolve的HTTPS请求(指定IP+域名SSL验证)

要实现和curl --resolve example.com:443:192.168.1.55 https://example.com等效的效果,核心是强制将域名解析到指定IP,同时保留域名的SSL证书验证逻辑,下面提供两种实用实现方式:

方法1:用dart:io原生HttpClient手动配置

直接通过原生HttpClient控制连接目标和SSL验证主机,适合轻量场景:

import 'dart:io';
import 'dart:convert';

Future<void> sendCustomHttpsRequest() async {
  const targetDomain = 'example.com';
  const targetIp = '192.168.1.55';
  const targetPort = 443;

  final client = HttpClient();
  
  try {
    // 直接连接指定IP和端口
    final request = await client.getUrl(Uri.parse('https://$targetIp:$targetPort'));
    // 设置Host头,让服务器识别请求的域名
    request.headers.set('Host', targetDomain);
    // 强制SSL验证使用目标域名,避免IP与证书域名不匹配的错误
    request.connectionInfo = HttpClientConnectionInfo(
      host: targetDomain,
      port: targetPort,
    );

    final response = await request.close();
    final responseBody = await response.transform(utf8.decoder).join();
    
    print('状态码: ${response.statusCode}');
    print('响应内容: $responseBody');
  } catch (e) {
    print('请求失败: $e');
  } finally {
    client.close();
  }
}

方法2:用Dio拦截器配置(适合项目级场景)

如果项目使用Dio网络库,通过自定义HttpClientAdapter实现域名定向解析,代码更易复用:

import 'dart:io';
import 'package:dio/dio.dart';
import 'package:dio/io.dart';

void setupDioWithCustomResolve() {
  const targetDomain = 'example.com';
  const targetIp = '192.168.1.55';

  final dio = Dio();
  
  // 替换默认的HttpClient适配器,注入自定义解析逻辑
  dio.httpClientAdapter = IOHttpClientAdapter(
    createHttpClient: () {
      final client = HttpClient();
      // 针对目标域名,强制解析到指定IP
      client.findProxy = (uri) {
        if (uri.host == targetDomain) {
          return 'PROXY $targetIp:443';
        }
        return 'DIRECT';
      };
      return client;
    },
  );

  // 直接用域名发起请求,底层会自动路由到指定IP
  dio.get('https://$targetDomain').then((response) {
    print('状态码: ${response.statusCode}');
    print('响应数据: ${response.data}');
  }).catchError((e) {
    print('请求失败: $e');
  });
}

关键注意事项

  • 若目标服务器使用自签名证书,可临时添加badCertificateCallback跳过验证(生产环境禁止):
    client.badCertificateCallback = (X509Certificate cert, String host, int port) {
      return host == targetDomain; // 仅允许目标域名的自签名证书
    };
    
  • 必须确保目标IP的443端口开放,且服务器已配置对应域名的SSL证书。

内容的提问来源于stack exchange,提问作者Shashi kumar S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 09:12:45