提问人:Timur Portman 提问时间:10/26/2023 最后编辑:JonasTimur Portman 更新时间:11/22/2023 访问量:47
React Native 不起作用 在本地网络上获取请求
React Native doesn't work Get request on local network
问:
我是新手,已经好几天没能解决这个问题了。本地网络(智能家居)上有一个设备,我可以使用 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 请求可能无法在真实手机上工作
- 您的设备可能与智能家居设备未连接到同一本地网络。
- 您的手机可能没有访问智能家居设备所需的权限。
- 您发出提取请求的方式可能存在问题。
我认为您需要使用 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>
);
而且我认为您需要先检查更多
- 确保您的智能家居设备配置为允许远程访问。
- 如果您使用的是代理,请确保代理配置正确。
如果仍有问题,请提供有关您的设置和您看到的错误消息的更多信息。
评论
我也有类似的问题。这是我的解决方案:
要切换智能家居设备,我可以使用任何浏览器发送 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,但这只是一个紧急解决方案)
评论