Проблемы с доступом к localhost: номер порта в эмуляторе Android

#flutter #dart #localhost #avd

#сбой #dart #localhost #android-виртуальное устройство

Вопрос:

Я видел многочисленные сообщения на flutter &ithub, а также здесь о моей проблеме, однако она все еще сохраняется. У меня есть ASP.NET API, размещенный на порту 5001, который возвращает объект JSON. Я попытался изменить URL-адрес, чтобы он указывал на 10.0.2.2: 5001 вместо localhost, добавив 10.0.2.2 с номером порта в качестве прокси-сервера в эмуляторе, понизив рейтинг emualtor до Pie. У меня ничего из этого не сработало. Вот проблемный раздел кода, о котором идет речь:

   Future<Foo&&t; fetchJson() async {
    var response = await client.&et(
        "http://10.0.2.2:5001/api/SampleApp/FetchObject",
        headers: {"Accept": "application/json", "Content": "application/json"});
    var somethin& = Foo.fromJson(jsonDecode(response.body));
    return somethin&;
  }
  
 Exception has occurred.
ClientException (Connection closed before full header was received)
  

Комментарии:

1. На какой ОС вы работаете? URL http://10.0.2.2:your-port работает для меня в Windows. (Я использую Express, поэтому я не уверен, имеет ли это значение)

2. Вы пробовали использовать URL: http://127.0.0.1:5001 ?

3. 127 не работает, поскольку это локальный хост устройства, к сожалению, эмулятор Android имеет собственную сеть. Раздражает то, что 10.0.2.2 кажется решением, которое должно работать, но по какой-то причине оно не возвращает 200. Я на Windows.

Ответ №1:

Потратив несколько часов на поиск решения этой проблемы, выясняется, что проблема заключается в том, что SSL включен при использовании ASP.NET API. Чтобы устранить эту проблему, я отключил опцию с поддержкой SSL в свойствах проекта в моем серверном решении и использовал n&rok, чтобы сделать порт localhost общедоступным. У них также есть расширение visual Studio, которое действительно упрощает открытие туннеля.

Обратите внимание, что эта проблема имеет отношение только к вашему API, запускаемому на localhost, когда он развернут, тогда ваш эмулятор должен иметь возможность пинговать API с развернутого URL-адреса без проблем. Я полагаю, что это связано с тем, что эмулятор или физическое устройство Android не могут использовать 10.0.2.2 / 10.0.3.2 (Genymotion) с включенным SSL, поскольку запрос будет отклонен из-за сертификата.