Невозможно совершать вызовы на Localhost с помощью Flutter, случайный порт назначается для вызова HTTP GET
Я пытаюсь создать приложение Flutter, где мне нужно сделать HTTP-вызов с использованием библиотеки dart http. Итак, вот фрагмент фу, который я использую, чтобы позвонить,
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 работает и работает правильно. Как вы можете видеть из журналов ошибок, запрос, похоже, не выполняется. В чем именно проблема здесь?
Для записи, я попробовал каждую перестановку get
, getUrl
и даже попытался заменить localhost
а также 127.0.0.1
с 10.0.2.2
как упомянуто в Как указать localhost:8000 с пакетом Dart http во Flutter?, Я тестирую это на своем телефоне напрямую (One Plus 3)
1 ответ
Это должно сделать это
adb reverse tcp:5000 tcp:5000
https://developer.android.com/studio/command-line/adb.html
Или использовать adb reverse --list
чтобы увидеть, какие перенаправления настроены.
Ответ Гюнтера правильный, но вы должны помнить одну вещь: не забудьте изменить номер порта. Например, если ваш порт - 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>