React native fetch api не работает с localhost, IP или даже с 10.0.2.2

Я использую клиент expo на своем устройстве Android и настроил сервер django на localhost:8000, и я пытаюсь получить доступ к конечной точке, используя выборку в собственном реагировании. Я просмотрел Как я могу получить доступ к своему локальному хосту с моего устройства Android?Как подключить localhost в эмуляторе Android? и Как подключиться к моему веб-серверу http: // localhost из эмулятора Android в Eclipse, но это не сработало.

Я также попытался использовать IP-адрес моей машины вместо localhost, но безрезультатно. Вот пример кода

componentDidMount(){
    return fetch('http://my-ip-address:8000/restapi/')
      .then((response) => {
        console.info("success")
        response = response.json()
      }).catch(error => {
        console.error(error)
      })
  }

Что я здесь делаю не так?

Вы тестируете на своем устройстве или симуляторе?

Jeff Gu Kang 20.09.2018 04:20

Попробуйте 127.0.0.1 в качестве своего IP-адреса. Если это не сработает, попробуйте обратиться к почтальону, чтобы узнать, сможете ли вы общаться.

sbso 20.09.2018 04:24

Я использую свое мобильное устройство. Пробовал 127.0.0.1. Это не сработало, а также я использовал почтальона, чтобы убедиться, что получаю правильный ответ

ann 20.09.2018 05:19

Использование реального устройства немного отличается. Основываясь на приведенных вами ссылках на эмулятор и используя 10.0.2.2, я предположил, что вы используете эмулятор. Ваш телефон находится в той же сети. Вы подтвердили, что у вас нет брандмауэра или чего-либо, блокирующего входящие соединения / порт?

sbso 20.09.2018 05:53

Чтобы было ясно, "успех" не выводится в консоли, верно? И вы используете адрес локальной сети, и все рассматриваемые устройства подключены к одной сети?

csum 20.09.2018 06:16

Мой телефон находится в той же сети Wi-Fi. И я проверяю свой брандмауэр на блокировку соединений. Я попробую эмулятор и посмотрю, работает ли это

ann 20.09.2018 06:16

Может ли ваш телефон получить доступ к тому же URL-адресу в веб-браузере?

csum 20.09.2018 06:27

Да, все устройства находятся в одной сети Wi-Fi. И я не могу получить доступ к тому же URL-адресу через свой телефон

ann 20.09.2018 06:37

Если браузер вашего телефона не может получить доступ к тому же URL-адресу, это может быть проблема конфигурации django. Я не знаком с django, но это может помочь сделать сервер django доступным в вашей сети

csum 20.09.2018 06:49
4
9
6 754
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Решение

Согласно вашему коду,

  • ваш порт django: :8080
  • целевой порт вашей выборки: :8000

Проверить снова. И я рекомендую использовать Почтальон при тестировании API вашего сервера.

Жаль, что я сделал ошибку. Порт 8000

ann 20.09.2018 05:13
Ответ принят как подходящий

Это может быть проблема с конфигурацией django. Особенно, если веб-браузер вашего телефона также не может получить ожидаемый ответ.

Из Документы Django:

Note that the default IP address, 127.0.0.1, is not accessible from other machines
on your network. To make your development server viewable to other machines on the
network, use its own IP address (e.g. 192.168.2.1) or 0.0.0.0 or :: (with IPv6 enabled).

См. Как получить доступ к локальному веб-серверу Django из внешнего мира, хотя ответ также применим в локальной сети:

python manage.py runserver 0.0.0.0:8000

Вы можете заменить 0.0.0.0 на адрес устройства, если вы его знаете.


Также стоит отметить в обработчике ответа, что response.json() возвращает обещание, а не JSON. Вместо этого вы хотите:

fetch('http://my-ip-address:8000/restapi/')
  .then(response => response.json())
  .then(responseJson => {
    console.info("success");
    console.info(responseJson);
  })
  .catch(error => {
    console.error(error);
  })

В дополнение к ответу csum проверьте, разрешил ли брандмауэр удаленный доступ к вашему устройству Android (IP-адрес устройства как удаленный) для сервера django. Если у вас установлен какой-либо антивирус и управляет брандмауэром, убедитесь, что в его брандмауэре есть правило.

Другие вопросы по теме