Android中使用java.net.HttpURLConnection发起HTTP请求失效怎么办
Android平台HTTP请求失败排查方案
你这段代码在标准Java环境下可以正常执行,但在Android系统上运行失败,基本是以下几个平台特有规则、配置缺失或者写法疏漏导致的:
- 最常见原因:在主线程执行网络操作。Android从API 11(Android 3.0)开始就做了严格限制,不允许在UI主线程执行任何耗时的网络请求,只要你在主线程直接调用
getResponseCode()、getInputStream()这类网络方法,会直接抛出NetworkOnMainThreadException,请求直接终止。所有网络逻辑必须放到子线程执行,你可以用原生Thread配合Handler做线程切换,也可以用协程这类异步框架处理。 - 基础配置遗漏:没有声明网络权限。你需要在项目的
AndroidManifest.xml中,<application>标签同级位置添加INTERNET权限声明,否则应用完全没有联网权限:
<uses-permission android:name="android.permission.INTERNET" />
如果你的应用目标SDK版本≥28(适配Android 9及以上系统),请求非HTTPS的明文HTTP地址时,还需要在<application>标签上添加android:usesCleartextTraffic="true"属性,否则明文请求会被系统直接拦截,你当前用的是HTTPS地址暂时不需要配置这个项。
- 代码写法不完善:你当前的极简写法没有设置基础连接参数,也没有处理异常分支,很容易出现超时、被服务端拦截、错误流未读取等问题。可以参考下面的基础可用写法:
// 开启子线程执行网络请求 new Thread(() -> { HttpURLConnection conn = null; try { URL requestUrl = new URL("https://omg-a-site.org"); conn = (HttpURLConnection) requestUrl.openConnection(); // 基础连接配置 conn.setRequestMethod("GET"); conn.setConnectTimeout(10000); // 连接超时设置为10秒 conn.setReadTimeout(10000); // 读取超时设置为10秒 conn.setInstanceFollowRedirects(true); // 自动处理3xx重定向 int responseCode = conn.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { // 响应码200时读取正常输入流 InputStream is = conn.getInputStream(); // 在这里写流读取、解析的逻辑,流使用完必须关闭 } else { // 4xx、5xx等错误响应需要读取错误流获取错误信息 InputStream errorIs = conn.getErrorStream(); } } catch (Exception e) { // 打印异常堆栈可以直接定位具体错误原因 e.printStackTrace(); } finally { if (conn != null) { conn.disconnect(); } } }).start();
- 特殊场景排查:如果HTTPS请求报SSL握手相关错误,先检查测试设备的系统时间是否正确,时间偏差过大会导致证书校验失败;如果请求的是使用自签名证书的内部站点,需要额外配置证书信任规则,否则会直接抛出SSLHandshakeException。
调试时优先查看catch块捕获的具体异常类型和堆栈信息,不需要盲目排查,异常信息会直接告诉你失败的根本原因。
内容的提问来源于stack exchange,提问作者letleaf
相关产品推荐
相关产品推荐

