React Native 不起作用 在本地网络上获取请求

React Native doesn't work Get request on local network

提问人:Timur Portman 提问时间:10/26/2023 最后编辑:JonasTimur Portman 更新时间:11/22/2023 访问量:47

问:

我是新手,已经好几天没能解决这个问题了。本地网络(智能家居)上有一个设备,我可以使用 get 请求 (http://192.168.0.100/Power?Power=1) 从浏览器打开和关闭它而不会出现问题。我正在为 Android 编写一个应用程序,在模拟器的 React Native 中一切正常,但在真实手机上安装该应用程序后,一切都无法正常工作。请帮我弄清楚。

const test = () => {
    fetch('http://192.168.0.100/Power?Power=1', true)
  };
return (
     <TouchableOpacity
        onPress={() => test()}>
     </TouchableOpacity>
       )
react-native http请求

评论


答:

0赞 rain developer 10/26/2023 #1

答:

有几个可能的原因导致您的 React Native 获取 HTTP 请求可能无法在真实手机上工作

  1. 您的设备可能与智能家居设备未连接到同一本地网络。
  2. 您的手机可能没有访问智能家居设备所需的权限。
  3. 您发出提取请求的方式可能存在问题。

我认为您需要使用 Axios 来发出获取请求,以下代码对您有所帮助

import axios from 'axios';

const test = () => {
  axios.get('http://192.168.0.100/Power?Power=1')
    .then(response => {
      // Success!
    })
    .catch(error => {
      // Error!
    });
};

return (
  <TouchableOpacity onPress={() => test()}>
    <Text>Turn on power</Text>
  </TouchableOpacity>
);

而且我认为您需要先检查更多

  • 确保您的智能家居设备配置为允许远程访问。
  • 如果您使用的是代理,请确保代理配置正确。

如果仍有问题,请提供有关您的设置和您看到的错误消息的更多信息。

评论

0赞 Timur Portman 10/27/2023
感谢您的快速回复!手机连接到同一个 wifi,手机上的浏览器一切正常,手机上还有一个 MacroDroid 应用程序,我从中发送 get,并打开和关闭所有内容。在我的应用程序中,我检查了对外部站点的 Post 和 Get 请求运行正常,但他们不想去本地。我尝试了 axios 和 fetch,没有任何变化。
0赞 Timur Portman 10/27/2023
今天我尝试连接我的手机而不是 Android 模拟器,应用程序加载并且一切正常,但是当我发布 apk 并将其安装在手机上时,什么也不起作用......我还试图通过世博会制作一个apk,但没有任何效果。
0赞 rain developer 10/27/2023
-> 我认为您的路由器阻止了来自您的应用程序的请求。您可以尝试检查路由器的设置,看看是否有任何防火墙或其他安全功能阻止了来自您的应用程序的请求。 -> 另一种可能性是您的智能家居设备配置为仅允许来自某些 IP 地址的请求。您可以检查设备的设置,查看是否有任何 IP 地址的白名单或黑名单。->我认为您可以尝试使用网络嗅探器来捕获手机和智能家居设备之间的流量。
1赞 Ralf Stehle 12/10/2023 #2

我也有类似的问题。这是我的解决方案:

要切换智能家居设备,我可以使用任何浏览器发送 http 请求: http://192.168.178.101/relay/0?turn=toggle 但是尝试使用 android studio 编写应用程序失败了。

我尝试了所有库:旧的 apache、okhttp3、khttp、fuel 和 volley。

这是一个非常简短的带有凌空抽射的代码片段。这适用于 www 中的 http-adress,但不适用于我的家庭网络:

val requestQueue = Volley.newRequestQueue(this@MainActivity)
url = "https://jsonplaceholder.typicode.com/users",
val request = StringRequest(
    Request.Method.GET,
    url,
    {
        findViewById<TextView>(R.id.txtView1).text = it
    },
    { Log.d("error",it.toString())}
)
requestQueue.add(request)

我向androidmanifest.xml添加了所有可考虑的权限:

 <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:usesPermissionFlags="neverForLocation" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION " />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

令人惊讶的是,该应用程序可以在我装有 android 8 的旧智能手机上运行!

在比较 Android 版本时,我发现这个有用的线程:如何在 Android (9) Pie 中允许所有网络连接类型 HTTP 和 HTTPS?

将此行插入androidmanifest.xml后,它可以工作!

android:usesCleartextTraffic="true"

(或者,您可以将 gradle 中的 sdk 降级为 targetSdk = 26,但这只是一个紧急解决方案)