Android Volley连接Rest API报错NoConnectionError求助排查
嘿,我来帮你解决这个Android端调用Rest API失败的问题,结合你的报错信息和代码,咱们一步步梳理可能的原因和解决方案:
1. 先注意到一个明显的端口矛盾
你的代码里请求的URL是http://192.168.2.100:8080/...,但报错信息显示尝试连接的是80端口:
com.android.volley.NoConnectionError: java.net.ConnectException: Failed to connect to /192.168.2.100:80
先仔细检查代码:有没有其他地方覆盖了这个URL变量?或者是不是拼写时不小心把8080写成了80?如果是测试时改了URL但没同步,很容易出现这种问题。
2. 确认网络权限是否配置正确
Android应用必须声明网络权限才能访问外部网络,打开你的AndroidManifest.xml,确保添加了这两行:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
虽然INTERNET是普通权限,不需要动态申请,但如果清单里没加,应用完全无法发起网络请求。
3. 解决Android 9+的明文HTTP限制
从Android 9(API 28)开始,系统默认禁止明文HTTP请求(只允许HTTPS),而你的API用的是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.2.100</domain> </domain-config> </network-security-config>
- 然后在
AndroidManifest.xml的<application>标签里添加引用:
android:networkSecurityConfig="@xml/network_security_config"
方法二:直接允许明文流量(仅测试用,不推荐生产环境)
在AndroidManifest.xml的<application>标签里添加:
android:usesCleartextTraffic="true"
4. 确保设备和服务器在同一局域网
Postman能正常访问API,说明服务器本身是正常的,但如果你的Android设备和服务器不在同一个局域网(比如手机用流量,服务器在办公室Wi-Fi),肯定连不上。确保你的Android设备和运行API的服务器连接同一个Wi-Fi,并且服务器的IP地址是局域网内的有效地址(比如你用的192.168.2.100是局域网IP,没问题)。
5. 检查服务器端口和防火墙
- 确认API服务确实在
8080端口运行:可以在服务器上用命令查看端口占用情况:- Windows:
netstat -ano | findstr :8080 - Linux/Mac:
lsof -i :8080
- Windows:
- 检查服务器所在电脑的防火墙,有没有阻挡
8080端口的入站请求,暂时关闭防火墙测试一下,看是否能连接。
6. 确认Volley请求的上下文有效性
你用this作为Volley.newRequestQueue的参数,要确保这个this是有效的Context:
- 如果是在Activity里调用,没问题;
- 如果是在Fragment里,应该用
getActivity()或者requireContext(),避免上下文为空导致的异常。
内容的提问来源于stack exchange,提问作者Amol Khot

