You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flutter Android端向Flask后端发送POST请求时出现“Connection refused”但curl可正常访问的问题求助

Flutter Android端向Flask后端发送POST请求时出现“Connection refused”但curl可正常访问的问题求助

嘿,我之前也踩过几乎一模一样的坑!折腾了大半天终于解决了,咱们一步步来排查:

首先最可能的元凶——Android 9(API 28)及以上版本默认会拦截明文HTTP请求,PC端的curl不受这个限制,但Android的安全策略会直接把非HTTPS的请求拦下来。解决方法很直接:

  1. 到你的Flutter项目的android/app/src/main/res目录下,新建一个xml文件夹,然后创建network_security_config.xml文件,内容写:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <!-- 填入你的Flask服务器IP -->
        <domain includeSubdomains="true">192.168.2.123</domain>
    </domain-config>
</network-security-config>
  1. 打开android/app/src/main/AndroidManifest.xml,在<application>标签里加上这个配置:
android:networkSecurityConfig="@xml/network_security_config"

另外务必确认AndroidManifest.xml里已经加了基础网络权限:

<uses-permission android:name="android.permission.INTERNET" />

接下来检查Flask的监听状态:
你说已经用了host='0.0.0.0',但最好再确认下Windows的端口监听情况。打开命令提示符,输入netstat -ano | findstr :5050,看看输出里的本地地址是不是0.0.0.0:5050——如果是127.0.0.1:5050的话,说明Flask其实只监听了本地回环,其他设备根本访问不了。

然后排查设备间的网络连通性:
虽然在同一个Wi-Fi,但有些路由器会开启AP隔离功能,导致同网设备互相不能访问。你可以用Pixel 7a的浏览器直接访问http://192.168.2.123:5050,看看能不能打开Flask的默认页面;或者用手机上的终端工具(比如Termux)模拟请求:

curl http://192.168.2.123:5050/chat -X POST -H "Content-Type: application/json" -d '{"message":"test"}'

看看能不能拿到正常响应。

还有个小细节可以优化:
你的Flutter代码里catch块只输出了$e,可以改成e.toString(),这样能看到更详细的错误细节,比如到底是连接被拒绝、超时还是其他问题,方便精准定位。

最后再排查下杀毒软件:
虽然你关了Windows防火墙,但有些第三方杀毒软件(比如360、卡巴斯基这类)自带独立防火墙,可能偷偷拦截入站请求,你可以暂时关闭杀毒软件试试,或者把Flask的5050端口加入信任列表。

我当初就是被Android的明文HTTP限制卡了好久,先试第一个方法,大概率能解决问题!

内容来源于stack exchange

火山引擎 最新活动