ROME Feeds:把代理放在 HTTP 客户端上
让 HTTP 客户端负责代理路由和状态处理,再把它的数据流和内容类型交给 ROME 的 XML 读取器。
ROME 负责解析 feed 的字节;代理路由和账号应当由 HTTP 客户端掌管。对于选定的 JDK HttpClient,固定代理应设置在其 builder 上:
HttpClient client = HttpClient.newBuilder()
.proxy(ProxySelector.of(
new InetSocketAddress("proxy.example", 8080)))
.build();
若要在无需代理认证的情况下测试允许的公开 feed,请把占位的主机和端口换成 HTTP 代理列表中的候选。再为该客户端加上部署所需的认证和请求限制。等到它取得可接受的响应后,把数据流交给 ROME:
try (XmlReader reader = new XmlReader(body, contentType)) {
SyndFeed feed = new SyndFeedInput().build(reader);
}
现代的 import 是 com.rometools.rome.io.XmlReader 和 SyndFeedInput。这里的 body 是收到的 InputStream,contentType 是 HTTP Content-Type。XmlReader 会考虑 BOM、这些元数据以及 XML 声明。先用任意 charset 解码可能会丢掉有用的证据。
解析之前先检查 HTTP 状态。否则代理登录页或拒绝访问可能表现为 XML 错误。被拒绝的响应也要释放 body,以免 HTTP 错误让数据流一直打开。
两个 feed 源可以使用配置不同的客户端,而无需在调用之间修改 JVM 的代理属性。每个 HTTP 客户端拥有自己的路由,ROME 则拥有解析这一步。