Retrofit2真机请求ResponseBody为null求助:模拟器正常真机报403
解决Retrofit2在真机访问本地服务返回403/ResponseBody为null的问题
我之前也碰到过几乎一模一样的情况,结合你的排查结果,问题的核心其实是模拟器和真机对「localhost」的解析完全不同,再加上本地服务器的访问权限限制,才导致了这个差异。下面一步步给你解决:
1. 先搞懂为什么模拟器正常、真机不行
- 安卓模拟器里的
localhost(或者10.0.2.2)是映射到你电脑的本地服务的,所以能正常访问到phpMyAdmin - 但真机的
localhost是指向它自己的系统,根本找不到你电脑上的服务,再加上你的服务器可能只允许本地IP(127.0.0.1)访问,所以直接返回了403禁止访问
2. 第一步:把baseUrl里的localhost换成电脑的局域网IP
首先确保你的真机和运行phpMyAdmin的电脑连在同一个WiFi下,然后:
- Windows电脑:按Win+R输入
cmd,执行ipconfig,找「无线局域网适配器 WLAN」里的「IPv4地址」,比如192.168.1.105 - Mac/Linux:打开终端执行
ifconfig或ip addr,找WiFi对应的局域网IP
然后修改你的Retrofit代码里的baseUrl,比如原来的http://localhost/api/改成http://192.168.1.105/api/
3. 第二步:修改服务器配置,允许局域网访问
403状态码说明服务器拒绝了真机的请求,得调整Apache/phpMyAdmin的权限设置:
针对Apache(XAMPP/WAMP这类集成环境)
找到Apache的配置文件httpd.conf(或者虚拟主机配置httpd-vhosts.conf),找到类似下面的配置段:
<Directory "path/to/your/phpmyadmin"> AllowOverride All Require local </Directory>
把Require local改成Require all granted(测试用),或者更安全的Require ip 192.168.1.0/24(只允许同一个局域网段的设备访问)
针对phpMyAdmin的单独配置
打开phpMyAdmin目录下的config.inc.php,找到下面的配置项,添加允许局域网IP的规则:
$cfg['Servers'][$i]['AllowDeny']['rules'] = array( 'allow 127.0.0.1', 'allow 192.168.1.0/24' // 换成你的局域网段 );
4. 第三步:处理安卓真机的网络限制
- 确保你的
AndroidManifest.xml里已经添加了网络权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- 如果是Android 9(API 28)及以上,默认禁止明文HTTP请求,需要配置网络安全规则:
在res/xml目录下创建network_security_config.xml:
然后在<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">192.168.1.105</domain> <!-- 你的电脑IP --> </domain-config> </network-security-config>AndroidManifest.xml的application标签里引用:<application ... android:networkSecurityConfig="@xml/network_security_config">
最后验证
先在真机的浏览器里输入http://你的电脑IP/phpmyadmin,如果能正常打开,说明服务器配置没问题;再运行你的App,Retrofit应该就能拿到正常的ResponseBody了。
内容的提问来源于stack exchange,提问作者JMAR
相关产品推荐
相关产品推荐

