Это то, что случается со мной в каждом проекте React Native.
Как я могу сделать запрос к моему локальному API (который работает на localhost)?
Чтобы иметь возможность сделать запрос на локальный компьютер, вам нужно сделать две вещи.
Во-первых, вы должны использовать IP-адрес вашего компьютера в качестве базового URL-адреса для запроса.
Чтобы узнать свой IP-адрес, просто введите эту команду на консоли и найдите inet, который выглядит как 192.168.1.200.
ifconfig | grep inet --- inet 192.168.1.200 netmask ...
После этого вам нужно будет обновить конфигурации Android и iOS.
Android
Одна из проблем может быть связана с CLEARTEXT HTTP, который защищает приложения от случайного использования трафика открытого текста.
Начиная с Android 9 (уровень API 28), поддержка открытого текста по умолчанию отключена.
* от Android Developers
Это означает, что Android может делать запросы только к источникам HTTPS. Поэтому нам нужно разрешить нашему приложению использовать источники HTTP.
В файл AndroidManifest.xml нам нужно добавить следующие строки:
<manifest ...> <uses-permission android:name="android.permission.INTERNET" /> <application android:name=".MainApplication" android:usesCleartextTraffic="true" android:networkSecurityConfig="@xml/network_security_config" ...> <activity android:name=".MainActivity" ...> ... </activity> </application> </manifest>
Это позволит нашему приложению подключаться к КАЖДОМУ источнику HTTP. Но мы хотим разрешить только IP-адрес вашего компьютера. Для этого нам нужно создать файл network_security_config.xml в папке main / res / xml.
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="false">localhost</domain> <domain includeSubdomains="false">10.0.2.2</domain> <domain includeSubdomains="false">192.168.1.200</domain> <base-config cleartextTrafficPermitted="true"/> </domain-config> </network-security-config>
Этот файл ограничивает домены HTTP, с которыми может взаимодействовать наше приложение. IP 10.0.2.2 - это псевдоним эмулятора для 127.0.0.1,, а 192.168.1.200 - IP-адрес нашей машины.
После этого нам нужно установить URL-адрес домена на эмуляторе Android. Итак, откройте Настройки разработчика, нажав CMD + M, а затем нажмите Хост и порт сервера отладки для устройства. В этом модальном окне мы добавляем IP-адрес нашего компьютера 192.168.1.200.
iOS
На стороне iOS у нас будет та же проблема, нам нужно разрешить нашему приложению выполнять запросы к источникам HTTP.
По умолчанию iOS блокирует любой запрос, не зашифрованный с использованием SSL. Если вам нужно выполнить выборку с открытого текста URL-адреса (который начинается с
http
), вам сначала нужно добавить исключение безопасности транспорта приложений. Если вы заранее знаете, к каким доменам вам потребуется доступ, безопаснее добавлять исключения только для этих доменов; если домены неизвестны до времени выполнения, вы можете полностью отключить ATS. Однако обратите внимание, что с января 2017 года обзор Apple App Store потребует разумного обоснования для отключения ATS. Дополнительную информацию см. В документации Apple.
* из React Native
Для этого нам нужно будет обновить наш файл Info.plist и добавить ключ NSAppTransportSecurity.
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>localhost</key> <dict> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict>
В iOS нам не нужно определять IP-адрес нашей машины, потому что он преобразует в него localhost.
После этого все, что нам нужно сделать, это переустановить наше приложение на эмуляторе, и все готово, теперь вы можете делать запросы к своему локальному API.
Примечание. Это следует использовать только в локальной среде разработки, не передавайте это в рабочее приложение.
Рекомендуемые ссылки
- Https://developer.android.com/training/articles/security-config
- Https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33
- Https://reactnative.dev/docs/network
Я разработчик программного обеспечения из Португалии, в настоящее время работаю в Runtime Revolution как интерфейсный и мобильный разработчик.