Google+ 用户的图片在特定日期后发生变化,如何下载?

How to download the picture of a Google+ user only if it has changed after a certain date?

我正在使用 Google API 来获取有关经过身份验证的用户的信息。我可以获得基本的个人资料信息,例如 ID 和全名。从个人资料信息中,我可以得到 URL 到图片:

var plusMeUri = new Uri($"https://www.googleapis.com/plus/v1/people/me?key=<APP-ID>&access_token=<ACCESS-TOKEN>");

string userResponse = await HttpClient.GetStringAsync(plusMeUri);

JObject userObject = JObject.Parse(userResponse);

    ...

var imageObject = userObject.GetValue("image") as JObject;

var pictureUrl = imageObject.GetValue("url").Value<string>();

var pictureUri = new Uri(pictureUrl);
string uri = $"{pictureUri.Scheme}://{pictureUri.Host}{pictureUri.AbsolutePath}";

var pictureRequest = new HttpRequestMessage(HttpMethod.Get, uri);
pictureRequest.Headers.IfModifiedSince = <previous-timestamp>;

HttpResponseMessage pictureResponse = await HttpClient.SendAsync(pictureRequest);

if (pictureResponse.StatusCode == HttpStatusCode.NotModified)
     // No need to handle anything else
     return;

问题

如果用户的图片没变,我不想下载。这就是我使用 IfModifiedSince 属性 的原因。它确实适用于 Facebook 的 API,但似乎不适用于 Google。我怎样才能让它发挥作用?

根据所提供的信息,您似乎想要做的是确定您要 downloading/about 下载的图像是否与您之前下载的图像相同。在查看了 Google+ API docs 后,您一直在使用的 header 似乎并未得到他们的 API 的正式支持(至少不明显)。

但这不是我们确定图像是否已更改的唯一方法(事实上,无论如何,上次修改日期不一定是最好的方法)。替代方法包括:

1) 比较两张图片

2) 检查 url(如果我们可以假设不同的资源有不同的 urls)

1 可能是最准确的,但也可能是效率最低的,所以如果您决定走那条路,我会把这个问题留给您解决。我认为最有前途的是#2。我继续对 API 进行了一些尝试,当您更新个人资料图片时,image.url 字段似乎发生了变化。

例如,这是我最后两张 Google+ 头像 URLs:

因此,无需等待服务器的响应并检查其 header 来决定图像是否已更新,您可以 short-circuit 整个 HTTP 请求通过简单地检查你拉下的最后一张图片是否来自同一个url。如果它来自同一个 URL,那么您可能已经获得了该图像,否则您可能没有它,因此无论如何都应该承担下载费用。

在这种情况下,您的代码将如下所示:

var imageObject = userObject.GetValue("image") as JObject;
var pictureUrl = imageObject.GetValue("url").Value<string>();

if(pictureUrl != <previous-picture-url>)
{
    // insert get new picture logic here...
}