HTTP 403 из приложения Java (но не веб-браузера), несмотря на набор User-Agent - PullRequest
0 голосов
/ 02 июня 2019

Я использую ROME для опроса и объединения RSS-каналов, которые обновляются каждые двадцать минут.Чтобы обойти возможное отсутствие User-Agent, я искусственно добавил тот, который я восстановил после установки Chrome.Соответствующий бит кода выглядит следующим образом:

URLConnection connection = new URL(feed.getFeedUrl()).openConnection();
connection.setRequestProperty("User-Agent",
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36");

SyndFeedInput input = new SyndFeedInput();
XmlReader reader = new XmlReader(connection.getInputStream(),
        "text/html; charset=UTF-8", true);
SyndFeed syndFeed = input.build(reader);

(feed.getFeedUrl() возвращает URL для канала в виде строки).Это работает для большинства фидов, которые я опрашиваю, но не для канала, расположенного на https://eurovoix.com/feed/, который возвращает HTTP-код ошибки 403 («Запрещено») при ответе.Фид работает нормально при вызове из браузера.Что может быть причиной этого?

Редактировать: Попытка использовать решение из этой цепочки - добавление CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL)); - не решает проблему, к сожалению.

1 Ответ

0 голосов
/ 02 июня 2019

В соответствии с приведенным выше обсуждением, я использовал клиент отдыха Джерси и проверил, что он работает нормально для меня. Вы также можете попробовать. Я использовал следующий файл jar.

Джерси-клиент версия 1.8

Если вы используете maven, вы можете включить следующую зависимость в pom.xml.

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-client</artifactId>
    <version>1.8</version>
</dependency>

Я приведу ниже код, вы можете проверить и подтвердить.

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;

public class TestGetCallByJersey {
  public static void main(String[] args) {
    String resourceUri = "https://eurovoix.com/feed";
    try {
      Client client = Client.create();
      WebResource webResource = client.resource(resourceUri);
      ClientResponse response =
          webResource
              .accept("application/xml")
              .header("User-Agent", "Mozilla/5.0")
              .get(ClientResponse.class);

      System.out.println("response status = " + response.getStatus());
      String result = response.getEntity(String.class);
      System.out.println("Output from api call .... \n" + result);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
...