gpt4 book ai didi

java - 在桌面 Java 应用程序中缓存 facebook 图像时理解 x-* header

转载 作者:行者123 更新时间:2023-12-01 15:55:21 26 4
gpt4 key购买 nike

这应该是一个相当简单的......就像经常发生的情况......

我正在用 Java 编写一个桌面应用程序,它必须保留来自 Facebook 的图像缓存。

我似乎无法根据资源修改日期可靠地确定缓存命中或未命中的时间。

我注意到last-modified Facebook 响应中的标题几乎总是(在通过以下方法检索个人资料图片的情况下)2009 年 1 月 1 日午夜...在打开 Chrome 资源监视器的情况下浏览网站上的几个页面,我发现许多图像确实如此将此日期设置为最后修改日期,并且在这种情况下,他们至少也倾向于具有 X-Backend , X-Blockid & X-Cache-by (或有时 X-N )字段。还有其他情况 last-modified设置为某个较旧的日期和 X-*不存在,以及其他排列(主要出现在界面和广告图形上)。

到目前为止,搜索有关这些的信息 x-* headers 加上有限的 HTTP 基础知识,让我对如何正确实现缓存知之甚少。显然,在普通浏览器和 Facebook 服务器之间,可以轻松确定缓存中的图像是否是最新的,但我不清楚用于确定这一点的机制。

目前,我有一个方法可以打开 URLConnection到适当的 Facebook 资源,设置 ifmodifiedsince如果缓存中已经存在相应的文件。如果我收到 304 响应代码,那么我会在调用 setLastModified 后返回 -缓存文件上的良好措施(部分原因是,目前,图像缓存将进入 SVN,并且每当它们碰巧被 checkout 时,它们都会被设置为 LastModified)。

public static void downloadPicture(String uid) {
try {
URL url = new URL("http://graph.facebook.com/" + uid + "/picture?type=large");
String fileName = "data/images/" + uid + ".jpg";

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

File cachedPic = new File(fileName);
long lastModified = cachedPic.lastModified();
if (cachedPic.exists()) {
conn.setIfModifiedSince(lastModified);
}

conn.connect();

if (conn.getResponseCode() == 304) {
System.out.println("Using cache for " + uid);
cachedPic.setLastModified(conn.getLastModified());
return;
}

System.out.println("Downloading new for " + uid);

ReadableByteChannel rbc = Channels.newChannel(conn.getInputStream());

FileOutputStream fos = new FileOutputStream(fileName);
fos.getChannel().transferFrom(rbc, 0, 1 << 24);
fos.close();
} catch (MalformedURLException e) {
System.err.println("This really shouldn't happen...");
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

毫无疑问,我执行此过程的方式还应该进行其他改进(上面的代码对于每个单独的项目都需要相当多的时间,这显然不应该,而且我确信我可以解决 - 尽管关于最佳实践的评论仍然受欢迎),但我需要找出的是为什么当存在任何缓存文件时我似乎总是得到 304,以及确保发送正确请求的正确方法是什么。

最佳答案

我认为这里的部分问题是 FB 在使用图形 API URL 获取图片时所做的重定向。 URL http://graph.facebook.com/user_uid/picture 实际上会将您重定向到该图片的另一个 URL。据我所知,当您更改个人资料图片时,重定向的 URL 也会发生变化。因此,实际图片 URL 不会经常更改,您重定向到的 URL 会更改。

我无法指出任何“官方”文档来支持这些说法,这只是我所经历的。

关于java - 在桌面 Java 应用程序中缓存 facebook 图像时理解 x-* header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5185566/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com