уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Сегодня рассмотрим три готовых метода для работы с изображениями в Google Contacts API. Эти методы включены в модуль Dephi, реализующий работу с API, который я рассматривал в этом посте. В процессе работы с изображениями натолкнулся на одну интересную особенность…но обо всем по порядку.

1. Загрузка фотографии контакта GMail

Об этом я рассказывал здесь, но для целостности картины, приведу полный листинг процедуры:

function TContact.RetriveImage:TJPEGImage;
var i:integer;
begin
  Result:=nil;
  for i:=0 to FLinks.Count - 1 do //ищем ссылку на изображение по атрибуту rel
    begin
      if FLinks[i].Rel='http://schemas.google.com/contacts/2008/rel#photo' then
        begin
          if Length(FLinks[i].Etag)>0 then //если ETag не пустой, то по этому адресу есть изображение
            begin
              Result:=TJPEGImage.Create;
              Result.LoadFromStream(SendRequest('GET',FLinks[i].Href,Owner.FAuth,CpProtocolVer,nil,nil));//загружаем изображение
              break;//прерываем цикл
            end;
        end;
    end;
end;

При этом, как я уже упоминал, вне зависимости от того изображение какого формата (jpg, png или gif) мы загружали — в ответ нам приходит изображение в формате jpg, что для нас намного проще — не надо анализировать формат принятого изображения.

1. Обновление фотографии контакта GMail

При обновлении изображения контакта нам необходимо знать два значения:
1. URL на который отправлять новое изображение
2. ETag старого изображения. ETag должен включаться в заголовок сообщения If-Match.
Кстати, если нам не важно какую версию фотографии обновлять, то вместо ETag можно использовать «*».
Процедура обновления изображения для контакта GMail выглядит следующим образом:

procedure TContact.UpdatePhoto(const PhotoFile: TFileName);
var
  i: Integer;
begin
  for i:= 0 to FLinks.Count - 1 do
    begin
      if FLinks[i].Ltype='image/*' then
        begin
           with THTTPSend.Create do
             begin
               Headers.Add('GData-Version: '+CpProtocolVer);//версия 3.0
               Headers.Add('Authorization: GoogleLogin auth=' + Self.FOwner.FAuth);
               MimeType := 'image/*';//обязательно указываем этот тип
               Headers.Add('If-Match: *');//обновляем изображение в любом случае
               Document.LoadFromFile(PhotoFile);//загружаем фото в поток
               if HTTPMethod('PUT',FLinks[i].Href) then //отправляем на сервер
                  begin
                     {здесь необходим анализ возвращенного документа}
                  end
              else
                ShowMessage(IntToStr(ResultCode)+' '+ResultString);
             end;
          break;
        end;
    end;
end;

Я не стал приводить в процедуре анализ документа на наличие ошибок, т.к. это тема отдельной статьи, но скажу, что необходимо как минимум проверять возвращенные данные на наличие XML-тега entry. Дело в том, что если при отправке нового изображения были допущены ошибки, например, неправильно сформированы заголовки, отправлен не поддерживаемый формат и т.д., то результатом выполнения HTTPSend будет «200 OK», а в документе будет содержаться сообщение об ошибке в виде простого plaintext. В противном случае, когда изображение успешно обновлено, нам вернется документ примерно такого содержания:

<?xml version=»1.0″ encoding=»UTF-8″ ?>
<entry xmlns=»http://www.w3.org/2005/Atom» xmlns:gd=»http://schemas.google.com/g/2005» gd:etag=»«Mh5ye3s6Sit7ImBZGW4AFxteMmwjJWZ5cTU.»«>
<id>http://www.google.com/m8/feeds/photos/media/vlad383%40gmail.com/54cbb4f68a234171</id>
<updated>2010-04-26T15:21:52.215Z</updated>
<app:edited xmlns:app=»http://www.w3.org/2007/app«>2010-04-26T15:21:52.215Z</app:edited>
<link rel=»self» type=»application/atom+xml» href=»http://www.google.com/m8/feeds/photos/media/vlad383%40gmail.com/54cbb4f68a234171» />
<link rel=»edit» type=»application/atom+xml» href=»http://www.google.com/m8/feeds/photos/media/vlad383%40gmail.com/54cbb4f68a234171» />
</entry>

3. Удаление фотографии для контакта GMail.

В целом процедура удаления фотографии идентична предыдущей — на редактирование. Используется тот же URL, те же заголовки, но только запрос не PUT, а DELETE. Поэтому приводить полный листинг процедуры лишь из-за одного слова — смысла нет. Но при удалении фотографий контактов есть один тонкий момент, который необходимо рассмотреть. Момент этот касается работы с изображением контакта для владельца аккаунта GMail. Дело в том, что используя Google Contacts API вы можете загружать для своей записи в контактах изображения также как и для любого другого контакта, но удалить сможете только одно — последнее. Наткнулся на это совершенно случайно, когда начал редактировать свою запись в контактах через API. Смотрите. У меня в аккаунте Google установлено изображение:

Я ради проверки загрузил ещё одно в Контакты:

Как и полагается в контактах стало отображаться последнее загруженное изображение. Теперь пробую удалить изображение через API — вторая картинка удаляется и на её место устанавливается первая (с назгулом) и никаким макаром не удаляется, хотя сервер на удаление отвечает «200 OK», типо все удалено.
Скорее всего этот момент связан с тем, что первое изображение относится не к контакту, а именно к профилю поэтому с использованием Contacts API оно и не удаляется.
Сейчас пробую разобраться с тем как менять фотку именно на аккаунте, должно быть решение, но пока его не обнаружил в документации.

0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии