我正试图从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();