java如何有效地检查图片库网站的更改?
我目前正在开发一个同步服务,可以从exchange服务器获取所有用户配置文件图片。 为了跟踪变化,我决定对响应体进行MD5编码,并将其与数据库中的实体保持在一起,以便在路径上进一步比较,查看图片是否发生了变化。而实际图片本身保存在磁盘上
图片大小为504x504像素,因此重量约为27 kb。 由于我要获取字节码的散列值,即使图片匹配,我仍然必须下载27kb的数组,这几乎不会提高速度(除了我不需要在磁盘上替换它)。乘以大量用户,即使所有图片都匹配,这项工作也需要20分钟
有没有办法优化同步,以便在图片相同的情况下不下载响应正文? 以下是一些代码,可以帮助您更好地理解:
entity = restTemplate.getForEntity(
Constant.EXCHANGE_URL_PREFIX + emailAddress + Constant.EXCHANGE_URL_SUFFIX, byte[].class);
这就是我所说的get请求
if (entity.hasBody()) {
String hexHash = Hex.encodeHexString(MessageDigest.getInstance("MD5").digest(bytes));
if (!listofHashes.contains(hexHash)) {
picture.remove();
} else picture.save();
}
总而言之:有没有一种方法可以使用restTemplate检测网页更改,而不下载整个页面?提前谢谢你
编辑:对ETag标题和@Cacheable注释的额外研究没有证明是成功的
# 1 楼答案
这实际上取决于与之通信的服务器的功能。如果该服务器不支持standard mechanisms(^{} 、^{} 等,如注释中所述)或发送任何其他自定义头,那么您别无选择,只能执行您描述的操作——计算客户端(在应用程序中)的响应体摘要
# 2 楼答案
您可以尝试使用HTTP GET,但只请求头
然后,从回复中验证“内容长度”和“上次修改”(如果它们与您已存储的图像不匹配,则必须再次下载)
例如,对维基百科中的一幅图像进行此操作,我得到了以下结果:
请注意,关于“内容长度”:
这是我使用的curl命令:
# 3 楼答案
条件GET
如果您的服务器实现了standard of Http1.1,则可以使用以下对之一来实现:
如果etag匹配或自上次获取日期以来未修改,服务器应返回304(未修改)
示例:
请求头:
响应标题:
结论
Ref