我正在通过尝试点击链接并获取响应代码(在 Java 中)来验证链接。但是我从代码中得到无效的响应代码(403或404),但从浏览器,当我检查网络活动时,我得到200状态代码。这是我获取响应代码的代码。[我事先对网址进行了基本的验证,比如将其设置为小写等]
static int getResponseCode(String link) throws IOException {
URL url = new URL(link);
HttpURLConnection http = (HttpURLConnection) url.openConnection();
return http.getResponseCode();
}
对于像 http://science.sciencemag.org/content/220/4599/868 这样的链接,当我运行此代码时,我得到了 403 状态。但是在浏览器(chrome)上,我得到了200状态。另外,如果我使用以下 curl 命令,我会得到 200 状态代码。
curl -Is http://science.sciencemag.org/content/220/4599/868
克服这个问题的唯一方法是:
- 检查程序发送的 HTTP 标头是什么(例如,通过向 http://scooterlabs.com/echo 发送查询并检查响应)
- 检查您的浏览器发送的HTTP标头是什么(例如,通过访问 https://www.whatismybrowser.com/detect/what-http-headers-is-my-browser-sending
- 发现差异
- 更改程序以发送与浏览器相同的标头(正常工作的标头)
我为您进行了此分析,事实证明,该网站需要一个类似于现有浏览器的 Accept 标头的Accept
标头。默认情况下,Java发送一些有效的东西,但不类似于那个。
您只需要更改程序,如下所示:
static int getResponseCode(String link) throws IOException {
URL url = new URL(link);
HttpURLConnection http = (HttpURLConnection) url.openConnection();
http.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
return http.getResponseCode();
}
(或实际浏览器使用的任何其他值)