使用两个不同的web浏览器(带有cookies等...清除)和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完全相同的头(它确实可以工作)。
使用wget的httpbin.org输出
{
"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)"
}
}完全相同的头,但结果完全不同。有人知道google使用tcp或http的哪些方面来审查他们对基于Spring的程序的输出吗?
发布于 2019-11-14 00:41:26
这个问题可能很久以前就已经解决了,没有人在这里给出任何答案。
我也遇到了同样的问题,结果是RestTemplate(String url, ...)应用编程接口的隐式编码。如果URL已编码,则将其作为URI RestTemplate(URI uri, ...)传递。否则,将其作为字符串传递。这解决了我的问题。
https://stackoverflow.com/questions/46478939
复制相似问题