从Android模拟器上的Flutter应用程序调用Flask端点



我正试图从Android模拟器上的Flutter应用程序调用Flask端点/api/v1/test

我得到以下错误:"Connection closed while receiving data".

在Flask日志中,我看到:127.0.0.1 - - [11/Apr/2023 11:16:34] "GET /api/v1/test HTTP/1.1" 200 -

我使用dio包执行HTTP请求。这是我的Dart代码:

static Future<dynamic> get(String endpoint) async {
var url = buildUrl(endpoint);
var response = await dio.get(url);
var resp = jsonDecode(response.data);
if (resp == null) {
return null;
}
return resp;
}
static String buildUrl(String endpoint) {
if (!kReleaseMode) {
return "http://192.168.1.31:5000/api/v1/$endpoint";
}
return "";
}

192.168.1.31是我的IPv4地址。

我有这个权限添加到我的AndroidManifest.xml:

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

我是这样启动我的Flask应用的:

if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)

我可以直接在Android模拟器上的Chrome浏览器中访问端点并查看响应。我还可以在我的主机上从Postman调用端点而不会出现问题。

我是新的应用程序开发,所以我不完全确定为什么HTTP请求总是失败时,从我的应用程序调用。

任何想法?

在经历了很多痛苦之后,这些是我的发现,希望它们可以帮助其他沮丧的灵魂(我仍然会因为某些原因间歇性地放弃请求):

  • 确保Flask服务器返回正确的响应(通过Android模拟器浏览器三重检查)
  • Android应用似乎默认不允许非HTTPS连接
  • 使用ngrok作为代理将请求隧道到本地服务器工作
  • Android模拟器不能直接与主机上的http://localhost通信,使用10.0.2.2:<port>代替
  • 尝试在HTTP客户端禁用证书检查以绕过HTTPS限制(仅用于开发目的)
static DefaultHttpClientAdapter _createUnsecuredAdapter() {
final adapter = DefaultHttpClientAdapter();
adapter.onHttpClientCreate = (client) {
// This line disables certificate verification on all platforms
client.badCertificateCallback = (cert, host, port) => true;
return client;
};
return adapter;
}
[...]
var dio = Dio()..httpClientAdapter = _createUnsecuredAdapter();

相关内容

最新更新