0

使用两个不同的网络浏览器(清除了 cookie 等)和 wget,我从 google-news rss url 得到了正确的响应https://news.google.com/news/rss/headlines/section/q/QUERY/My%20Search?ned=us&hl=en

但是,我尝试通过 Spring 的 RestTemplate 假装是 wget

HttpHeaders headers = new HttpHeaders();
headers.set("Accept", "*/*");
headers.set("Accept-encoding", "identity");
headers.set("User-Agent","Wget/1.19.1 (cygwin)");

ResponseEntity<String> responseEntity = restTemplate.exchange("https://news.google.com/news/rss/headlines/section/q/QUERY/My%20Search?ned=us&hl=en",
    HttpMethod.GET, new HttpEntity<String>(null, headers), String.class
);
System.out.println(responseEntity.getBody);

从语法的角度来看,结果是正确的,除了没有项目,即没有新闻文章。

我用 进行了测试http://httpbin.org/headers,所以我知道我正在发送与 wget 完全相同的标头(确实有效)。

httpbin.org 使用 wget 输出

{
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "identity",
    "Connection": "close",
    "Host": "httpbin.org",
    "User-Agent": "Wget/1.19.1 (cygwin)"
  }
}

使用上述代码配置的 RestTemplate 的 httpbin.org 输出:

{
 "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "identity", 
    "Connection": "close", 
    "Host": "httpbin.org", 
    "User-Agent": "Wget/1.19.1 (cygwin)"
  }
}

完全相同的标题但完全不同的结果。任何人都知道 tcp 或 http google 的哪些方面用于审查他们对基于 Spring 的程序的输出?

4

1 回答 1

2

这个问题可能很久以前就已经解决了,没有人在这里给出任何答案。

我有同样的问题,结果证明是RestTemplate(String url, ...)API 的隐式编码。如果 URL 已经编码,则将其作为 URI 传递RestTemplate(URI uri, ...)。否则,将其作为字符串传入。这解决了我的问题。

于 2019-11-13T16:41:25.943 回答