Java从ApkPure下载APK返回403错误但浏览器可正常访问如何解决
问题原因
ApkPure的服务器会校验HTTP请求头信息,直接通过Java默认的URL.openStream()发起请求时,会携带Java默认的User-Agent(格式类似Java/1.8.0_301),服务器识别到非浏览器的请求就会直接返回403禁止访问。
解决方案
你需要手动构造HTTP请求,模拟浏览器的请求头参数,修改后的代码如下:
import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; public class ApkDownloader { public static void main(String[] args) { String downloadUrl = "你的ApkPure下载链接"; String savePath = "本地保存的APK路径"; HttpURLConnection connection = null; try { URL url = new URL(downloadUrl); connection = (HttpURLConnection) url.openConnection(); // 模拟Chrome浏览器的请求头 connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"); connection.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8"); connection.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8"); // 禁用缓存 connection.setUseCaches(false); connection.setConnectTimeout(15000); connection.setReadTimeout(30000); try (InputStream in = connection.getInputStream()) { Files.copy(in, Paths.get(savePath), StandardCopyOption.REPLACE_EXISTING); System.out.println("APK下载完成"); } } catch (Exception e) { e.printStackTrace(); } finally { if (connection != null) { connection.disconnect(); } } } }
注意事项
- ApkPure的下载链接是临时生成的,带签名和有效期参数,过期后需要重新获取新的下载链接,否则也会返回403错误。
- 如果加了上述请求头还是返回403,可以打开浏览器的开发者工具,找到对应下载请求的完整请求头,把所有参数都模拟到代码中即可。
内容的提问来源于stack exchange,提问作者Teddy Kossoko
相关产品推荐
相关产品推荐

