首页 > 解决方案 > 仅当 Google+ 用户的图片在某个日期后发生更改时,如何下载该图片?

问题描述

我正在使用 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 的 API。我怎样才能让它工作?

标签: c#google-apigoogle-plus

解决方案


从给出的信息来看,您似乎正在尝试确定您正在下载/即将下载的图像是否与您之前下载的图像相同。在查看了Google+ API 文档之后,看起来您一直在使用的标头并未得到其 API 的正式支持(至少不明显)。

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

1)区分两个图像

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

1 可能是最准确的,但也可能是效率最低的,所以如果你决定走那条路,我会留给你解决。我认为最有希望的是#2。我继续尝试了一下 API,当您更新个人资料图片时,看起来 image.url 字段发生了变化。

例如,这是我最后两个 Google+ 个人资料图片网址:

因此,无需等待服务器的响应并检查其标头来确定图像是否已更新,您可以通过简单地检查您拉下的最后一个图像是否为是否来自相同的网址。如果它来自同一个 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...
}

推荐阅读