【问题标题】:Links give invalid response code from code but valid response code from browser链接给出来自代码的无效响应代码,但来自浏览器的有效响应代码
【发布时间】:2019-01-08 13:43:23
【问题描述】:

我通过尝试点击链接并获取响应代码(在 Java 中)来验证链接。但是我从代码中得到了无效的响应代码(403 或 404),但是从浏览器中,当我检查网络活动时,我得到了 200 个状态代码。这是我获取响应代码的代码。 [我事先对 url 进行基本验证,比如将其设为小写等]

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

【问题讨论】:

  • 该网站可能不喜欢机器人,并检查传入请求是否由已知浏览器发出。这听起来可能很愚蠢,但这是一种相当普遍的态度。
  • 请检查浏览器中的所有请求标头和响应标头 - 然后查看您的代码有什么不同。还请确保在收到 403 或 404 后阅读响应正文 - 它可能包含其他信息。
  • 您的代码是正确的,但您尝试测试的 URL 似乎有问题。恐怕 HttURLConnection 类无法获得正确的 url 地址
  • @kumesana 有什么办法克服这个问题吗?另外,如果我使用 curl,我会得到正确的状态码。
  • 你能贴出你用来发出请求的代码 sn-p 吗?

标签: java http-response-codes external-links


【解决方案1】:

克服这个问题的唯一方法是:

我为您做了这个分析,结果表明这个网站需要一个类似于现有浏览器的 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();
}

(或实际浏览器使用的任何其他值)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 2018-08-31
    相关资源
    最近更新 更多