Ссылки дают неверный код ответа из кода, но действительный код ответа из браузера - PullRequest
0 голосов
/ 08 января 2019

Я проверяю ссылки, пытаясь их поразить и получая коды ответов (на 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 при запуске этого кода. Но в браузере (хром) я получаю 200 статус. Кроме того, если я использую приведенную ниже команду curl, я получу 200 кодов состояния.

curl -Is http://science.sciencemag.org/content/220/4599/868

1 Ответ

0 голосов
/ 09 января 2019

Единственный способ преодолеть это:

  • проверьте, какие заголовки 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();
}

(или любое другое значение, используемое в реальном браузере)

...