【问题标题】:Unable to make calls to Localhost using Flutter, random port being assigned to HTTP GET call无法使用 Flutter 调用 Localhost,将随机端口分配给 HTTP GET 调用
【发布时间】:2018-09-26 02:25:53
【问题描述】:

我正在尝试构建一个 Flutter 应用程序,我需要使用 dart http library 进行 HTTP 调用。所以这里是我用来拨打电话的 fu 的片段,

import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:http/http.dart' as http;

Future<List> getData() async {
    List data = new List();
    var httpClient = new HttpClient();
    var request = await httpClient.get("localhost", 5000, '/search?query=hello');
    var response = await request.close();
    if (response.statusCode == HttpStatus.OK) {
      var jsonString = await response.transform(utf8.decoder).join();
      data = json.decode(jsonString);
      print(data);
      return data;
    } else {
      return data;
    }
  }

现在从我的代码中调用getData(),这是我得到的错误

E/flutter (30949): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter (30949): SocketException: OS Error: Connection refused, errno = 111, address = localhost, port = 46999
E/flutter (30949): #0      _HomePageState.getData (file:///home/bholagabbar/AndroidStudioProjects/fnd_modile_client/lib/main.dart:75:19)
E/flutter (30949): <asynchronous suspension>
E/flutter (30949): #1      _HomePageState.build.<anonymous closure> (file:///home/bholagabbar/AndroidStudioProjects/fnd_modile_client/lib/main.dart:56:15)
E/flutter (30949): #2      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:478:14)
E/flutter (30949): #3      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:530:30)
E/flutter (30949): #4      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:102:24)
E/flutter (30949): #5      TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:161:9)
E/flutter (30949): #6      TapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:94:7)
E/flutter (30949): #7      PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:315:9)
E/flutter (30949): #8      PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:73:12)
E/flutter (30949): #9      PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:101:11)
E/flutter (30949): #10     _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:143:19)
E/flutter (30949): #11     _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:121:22)
E/flutter (30949): #12     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:101:7)
E/flutter (30949): #13     _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:64:7)
E/flutter (30949): #14     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:48:7)
E/flutter (30949): #15     _invoke1 (dart:ui/hooks.dart:134:13)
E/flutter (30949): #16     _dispatchPointerDataPacket (dart:ui/hooks.dart:91:5)

我的 API 已启动并正常运行,正如您在错误日志中看到的那样,请求似乎没有通过。这里的问题到底是什么?

为了记录,我已经尝试了getgetUrl 的所有排列,甚至尝试用10.0.2.2 替换How to point to localhost:8000 with the Dart http package in Flutter? 中提到的localhost127.0.0.1。我正在我的手机上直接测试这个(一加 3)

【问题讨论】:

标签: dart flutter dart-http


【解决方案1】:

应该这样做

adb reverse tcp:5000 tcp:5000

https://developer.android.com/studio/command-line/adb.html

或使用adb reverse --list 查看设置了哪些重定向。

【讨论】:

  • 看来我搞混了。我认为应该是reverse 而不是forward adb reverse tcp:5000 tcp:5000
  • 现在想起来真是太愚蠢了。 android 试图访问的本地主机将是它自己。
  • 很抱歉没有提到它,但是是的,这就是需要重定向的原因。你不是第一个落入这个陷阱的人:D
  • 哈哈我很高兴知道,这是我第一次在移动设备上开发,我需要从 Flutter 开始。谢谢!
  • 这根本与 Flutter 无关。如果您从在模拟器上运行的应用程序访问 localhost,它会访问在模拟器内运行的操作系统的环回网络接口。如果你想访问另一台机器,那么你不能使用localhost。我的答案是将访问 localhost:5000 重定向到运行模拟器的机器上的端口 5000 的解决方法。您还可以将您尝试访问的服务器公开到公共 IP 接口,并在 Flutter 应用程序中使用该 IP 而不是 localhost,但这可能会很麻烦,例如,如果您使用 DHCP 并且 IP 不断变化。
【解决方案2】:

Günter 的回答是正确的,但是您需要记住一件事,那就是不要忘记更改端口号 例如,如果您的端口是 3002,则使用:

adb reverse tcp:3002 tcp:3002

请记住,上述命令是将手机的 3002 端口重定向到计算机的 3002 端口。

如果您想将手机的 3000 端口重定向到计算机的 3002 端口,那么命令如下所示

adb reverse tcp:3000 tcp:3002

更一般的答案是:

adb reverse tcp:<Your Phone's Port No.> tcp:<Your Computer's Port No>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-30
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多