Expo React Native安卓设备无法访问Django后端,求排查网络错误
问题分析与解决方法
核心问题1:本地回环地址无法跨设备访问
你在React Native中使用的127.0.0.1是安卓设备自身的回环地址,并非运行Django后端的电脑IP,安卓设备无法通过这个地址访问电脑上的服务。
解决方法:
- 查看电脑在局域网内的实际IP(Windows用
ipconfig,Mac/Linux用ifconfig或ip addr),格式通常为192.168.x.x - 修改
apiCall的baseURL为电脑局域网IP:
export const apiCall = axios.create({ baseURL: "http://192.168.x.x:8000/drinks/", // 替换为你的电脑实际局域网IP timeout: 3000, headers: { "Content-Type": "application/json", }, });
- 确保电脑与安卓设备连接在同一WiFi网络下
核心问题2:API请求路径重复
你的apiCall已将baseURL设为/drinks/,但调用时又使用get("/drinks/"),最终请求URL会变成http://xxx:8000/drinks//drinks/,路径重复会导致后端返回404错误,触发Axios网络错误。
解决方法:
- 方案一:修改baseURL为根路径,调用时指定完整路径:
// apiCall.js export const apiCall = axios.create({ baseURL: "http://192.168.x.x:8000/", // 其他配置不变 }); // DrinksScreen.js apiCall.get("/drinks/")
- 方案二:保持baseURL为
/drinks/,调用时使用空路径:
apiCall.get("/")
核心问题3:Django后端未开放局域网访问
默认情况下Django仅监听127.0.0.1,局域网内设备无法访问。启动后端时需指定绑定所有地址:
python manage.py runserver 0.0.0.0:8000
额外检查:安卓网络权限
确保Expo项目的app.json中包含网络权限:
{ "expo": { "android": { "permissions": ["INTERNET"] } } }
代码中的其他小问题
loadDrinksData的then回调里,你打印的data未定义,且Axios响应数据存放在response.data中- 未调用
setDrinks更新组件状态
修改后的loadDrinksData示例:
function loadDrinksData() { apiCall .get("/") // 对应baseURL为/drinks/的情况 .then((response) => { console.log("success!, data: ", response.data); setDrinks(response.data); }) .catch((error) => { console.log("error!: ", error); }); }
内容的提问来源于stack exchange,提问作者Rafael
相关产品推荐
相关产品推荐

