Приложение Flutter для Android не подключается к внешнему URL API. Подключается только к локальному внутреннему IP API.

Вопрос или проблема

Я использую vscode на Mac и у меня есть приложение Flutter, которое нужно подключить к URL API, например: www.test.com

При тестировании с использованием внутреннего IP, например: 10.0.0.3:80/api/Values/ приложение подключается нормально и отправляет и получает данные,

при тестировании с использованием внешнего URL приложение выдает следующую ошибку: сеть недоступна, нет адреса, связанного с именем хоста.

Код :

Future fetchAndSaveNotificationData() async {

 String? registrationHexNumber ="0";


try  {     
 


  // Замените на ваше имя пользователя и пароль
  String username="UserName";
  String password = 'PassWord';

  
  // Кодируем имя пользователя и пароль с помощью Base64 для базовой аутентификации
  String basicAuth="Basic " + base64Encode(utf8.encode('$username:$password'));

  final url = Uri.parse('http://www.test.com/api/Values/');

    print(' сюда 01 ${url.toString()}');


  final response = await http.post(
    url,
    headers: {
      'Content-Type': 'application/json',
      'Authorization': basicAuth,
    },
    body: jsonEncode({
      'registrationHexNumber': registrationHexNumber,
    }),
  );

    print('сюда 02 ${url.toString()}');


  if (response.statusCode == 200) {
    // Декодируем ответ JSON
   
    }

    
  } else {

  }
}   catch (e) {
  print("Ошибка: $e");
    }
}

Проблема, похоже, здесь:

print(' сюда 01 ${url.toString()}'); // я до сюда дохожу


  final response = await http.post(
    url,
    headers: {
      'Content-Type': 'application/json',
      'Authorization': basicAuth,
    },
    body: jsonEncode({
      'registrationHexNumber': registrationHexNumber,
    }),
  );

    print('сюда 02 ${url.toString()}'); // я не дохожу до сюда. 

Я могу получить доступ к URL API через веб-браузер эмулятора и физическое устройство, используемое для тестирования. Так что URL активен, и соединение не заблокировано.

У меня есть соответствующие разрешения, такие как:

  1. android.permission.INTERNET

  2. android.permission.ACCESS_NETWORK_STATE

Предоставление разрешения на интернет само по себе недостаточно.

Вы также должны убедиться, что вы подключены к интернету на эмуляторе и что режим «Режим полета» отключен.

Режим полета выключен

Статус интернет-соединения

Ответ или решение

Проблема, с которой вы столкнулись, связана с тем, что ваше приложение на Flutter не может подключиться к внешнему URL API, в то время как подключение к локальному IP-адресу работает без проблем. Судя по вашему описанию, вы уже проверили несколько потенциальных источников проблемы. Давайте рассмотрим шаги, которые вы можете предпринять для её устранения.

1. Проверьте наличие интернет-соединения

Убедитесь, что эмулятор или реальное устройство, на котором вы тестируете приложение, имеют активное интернет-соединение. Если вы используете эмулятор:

  • Проверьте, отключен ли режим "В самолете".
  • Проверьте статус подключения к интернету в настройках эмулятора.

2. Проверьте настройки фаервола и прокси

Иногда локальная сеть может блокировать доступ к определённым адресам:

  • Убедитесь, что фаерволл или антивирус на вашем компьютере не блокируют доступ к интернету для эмулятора.
  • Если вы используете прокси-сервер, убедитесь, что он настроен правильно в вашем приложении.

3. Проверьте код на наличие ошибок

Убедитесь, что ваш код корректен и не содержит ошибок. Например, вы используете http.post() для отправки запроса:

final response = await http.post(
    url,
    headers: {
        'Content-Type': 'application/json',
        'Authorization': basicAuth,
    },
    body: jsonEncode({
        'registrationHexNumber': registrationHexNumber,
    }),
);

Когда вы вызываете это, убедитесь, что url правильный и доступен. Попробуйте временно заменить его на https://jsonplaceholder.typicode.com/posts (например, это публичный тестовый API), чтобы проверить, работает ли сам механизм отправки.

4. Разрешения приложения

Как вы отметили, у вас есть разрешения на использование интернета. Убедитесь, что они добавлены в файл AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Проверьте, нет ли других потенциально необходимых разрешений, в зависимости от того, как ваше приложение использует сеть.

5. Проверьте ответ сервера

Так как вы можете открыть URL в веб-браузере эмулятора или физического устройства, но запрос из приложения не проходит, возможно, сервер может блокировать определенные типы запросов. Используйте инструменты разработки, такие как Postman, для проверки, правильно ли работает ваш API с теми же параметрами.

6. Используйте отладку

Добавьте более детализированные логи, чтобы увидеть, где именно происходит сбой. Например, если ваш код завершится ошибкой, вы можете использовать onTimeout или catchError для получения более подробной информации о возникшей проблеме.

Заключение

Устранение такой проблемы может потребовать комплексного подхода и проверки различных частей вашего окружения и кода. Начните с проверки подключения к интернету, дальнейшей отладки и анализа получаемых ошибок. Удачи вам в решении проблемы! Если у вас будут дополнительные вопросы или возникнут трудности, не стесняйтесь спрашивать.

Оцените материал
Добавить комментарий

Капча загружается...