dart - 在真实设备模式下模拟或运行时未处理 http 请求,但在模拟器上运行良好
问题描述
在我的颤振应用程序中,我有用户注册表单,它使用 http 请求将数据发送到服务器。
每当我使用模拟器(API 27 和 android 版本 8.1)提交表单并发送请求时,它工作正常,但在真正的 android 设备中它会在localhost服务器上出现错误
SocketException: OS Error: Connection refused, errno = 111, address = 127.0.0.1, port = 48134
我正在使用 7.1 版的 Android 设备
代码:
final JsonDecoder _decoder = new JsonDecoder();
Future<dynamic> post() {
return http.post(
"http://192.168.31.16:9091/myprj/api/register",
body: json.encode({
"username": "rahul",
"password": "rahul",
"email": "myemail@gmail.com",
}),
headers: {"Accept": "application/json","Content-type": "application/json",},
).then((http.Response response) {
final String res = response.body;
final int statusCode = response.statusCode;
if (statusCode < 200 || statusCode > 400 || json == null) {
throw new Exception("Error while fetching data");
}
return _decoder.convert(res);
});
}
在哪里,我使用了本地网络 IP192.168.31.16
而不是localhost
. 当我使用实时服务器地址时,它也可以使用 android 设备正常工作。问题仅在于具有真正的 android 设备的 localhost http 请求服务器。
希望你能理解我的问题。
解决方案
这很可能与您运行服务器的方式有关,因为只要您输入了正确的 IP 地址并且您的设备连接到同一网络,这似乎是正确的。
曾经让我感到困惑的是,如果您在“localhost”或“127.0.0.1”上运行您的服务器,它实际上可能并没有按照您的想法运行。这些都应该托管在仅允许从您自己的计算机访问的本地重定向中。模拟器很可能已经设置了一些东西,所以它就像连接到本地主机一样。
如果您在 192.168.31.16 上运行服务器,那可能会更成功,但是您可能无法从模拟器访问它。因此,请尝试在 0.0.0.0:9091 上运行,因为这意味着“本地计算机上的所有 IP 地址”,如果您还没有的话。
我建议在您的服务器上放置一个虚拟端点(如 /healthz),它只返回一个 html 或纯文本页面,上面写着“它可以工作”或类似的东西。然后打开手机的网络浏览器并前往那里。如果它有效,您知道您的手机能够与计算机通信,然后我们可以开始调查编码问题。如果它不起作用,您知道这与服务器的配置有关。
推荐阅读
- flutter - 问题:抽屉图标不显示与 sliver 应用栏相关联
- java - 如何从 Java 中创建的对象中获取数据并将其传递给方法
- python - 如何将 Python 中的所有 unicode 小写字符与正则表达式匹配?
- google-apps-script - 在自定义函数获取此值后将值存储在单元格中/Google 电子表格
- javascript - Javascript IF 语句将条件误解为函数
- c - 我的系统显示正确代码的错误输出,并且相同的代码在其他设备中给出正确的输出。如何纠正这个问题?
- eclipse - (选择不包含主类型)在 Eclipse
- java - 从本地手机存储中获取图像后自动将图像转换为位图
- python - 在python中附加到对象的列表属性时出错
- angular - 角度反应形式无法将数据传递给子组件