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

Flutter中使用dio发起GET请求时出现无效主机问题求助

解决Flutter Dio GET请求"invalid host"错误(Django后端)

可能的原因及对应方案

1. 检查Django的ALLOWED_HOSTS与请求Host头匹配

虽然浏览器和POST请求正常,但Django的ALLOWED_HOSTS对GET请求的Host头校验可能存在细节差异(比如Flutter Dio发送的Host头带端口,但ALLOWED_HOSTS未配置对应值):

  • 临时测试:将settings.py中ALLOWED_HOSTS = ['*'](生产环境禁止使用),重启Django服务后重试GET请求。若恢复正常,说明是Host头匹配问题。
  • 正式修复:在ALLOWED_HOSTS中添加Flutter请求实际发送的Host值,例:
    ALLOWED_HOSTS = ['localhost', '127.0.0.1', '192.168.1.100']
    

2. 排查Dio请求URL的格式问题

复制的URL可能包含空格、不可见字符,或拼接逻辑出错:

  • 硬编码完整URL测试,例:
    Response response = await Dio().get('http://192.168.1.100:8000/api/data/');
    
  • 打印请求的完整URL,确认无格式错误:
    String url = 'http://your-host:port/api/data/';
    print('Request URL: $url');
    Response response = await Dio().get(url);
    

3. 手动设置Dio请求的Host头

Dio默认请求头可能与浏览器存在差异,导致Django校验失败:

  • 手动指定与浏览器一致的Host头,例:
    Response response = await Dio().get(
      'http://your-host:port/api/data/',
      options: Options(
        headers: {
          'Host': 'your-host:port', // 与浏览器请求的Host值完全一致
        },
      ),
    );
    

4. 检查Django的安全中间件

若使用了额外安全中间件(如django-security),可能对GET请求有特殊校验:

  • 临时注释非必要安全中间件,重启服务测试,定位问题后调整中间件配置。

5. 本地真机测试的IP/域名适配

如果Flutter在真机测试,避免使用localhost,改用电脑的局域网IP(如192.168.x.x)——真机的localhost指向自身,而非Django服务器。


内容的提问来源于stack exchange,提问作者Masum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:02:06