Как загрузить фотографию пользователя Google+, только если она изменилась после определенной даты? - PullRequest
0 голосов
/ 17 октября 2018

Я использую Google API для получения информации об аутентифицированном пользователе.Я могу получить основную информацию о профиле, такую ​​как идентификатор и полное имя.Из информации профиля я могу получить 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.Он работает с API Facebook, но, похоже, не работает с Google.Как я могу заставить это работать?

1 Ответ

0 голосов
/ 17 октября 2018

Из представленной информации кажется, что вы пытаетесь определить, является ли изображение, которое вы загружаете / собираетесь загрузить, тем же самым, которое вы загружали ранее.После просмотра документов Google + API кажется, что используемый вами заголовок официально (по крайней мере, явно) не поддерживается их API.

Но это неЕдинственный способ определить, изменилось ли изображение или нет (на самом деле, дата последнего изменения не всегда является лучшим способом сделать это).Альтернативные методы включают в себя:

1) различие двух изображений

2) проверка URL (если мы можем предположить, что разные ресурсы имеют разные URL)

1, вероятно, является наиболее точнымно, вероятно, наименее эффективный, так что я оставлю это на ваше усмотрение, если вы решите пойти по этому пути.Я думаю, что наиболее перспективным является № 2.Я немного поиграл с API, и похоже, что поле image.url меняется при обновлении изображения вашего профиля.

Например, вот мои последние два URL-адреса изображений профиля Google+:

Таким образом, вместо ожидания ответа от сервера и проверки его заголовка, чтобы определить, имеет ли изображениеобновлено или нет, вы можете замкнуть весь 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...
}
...