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

Затеял я на днях поработать с Google Contacts API. Интересная тема, тем более, что контакты могут активно использоваться при создании мероприятий в Календаре. Так почему бы не совместить эти API в одной программе? Создали мероприятие, нашли в контактах нужного пользователя по имени, адресу, телефону и т.д., добавили в список подписчиков. Здорово. Но как это делается я расскажу немного позже, а пока обратим наши взоры на такой вопрос: каким образом работать с изображениями в Google API, т.е. загружать фотки на сервер, показывать в своих приложениях и удалять, если это требуется.

В прошлом посте про Google API я упоминал про узлы Link в которых содержаться какие-либо ссылки. В зависимости от значений атрибутов rel и type узла можно определить какая именно информация будет нам возвращена в результате запроса GET, POST, PUT и т.д.
Что касается фотографий в контактах, то узел Link для изображения может быть описан так:

<link rel='http://schemas.google.com/contacts/2008/rel#photo' type='image/*'
 href='http://www.google.com/m8/feeds/photos/media/liz%40gmail.com/8411573' />

или так:

<link rel='http://schemas.google.com/contacts/2008/rel#photo' type='image/*'
  href='http://www.google.com/m8/feeds/photos/media/liz%40gmail.com/c9012de'
  gd:etag='"KTlcZWs1bCp7ImBBPV43VUV4LXEZCXERZAc."'>

Как видите, атрибуты rel и type у ссылок абсолютно одинаковые, несмотря на то, что ссылки в href имеют разное назначение.
Так, в первом случае, атрибут href содержит ссылку только на добавление нового изображения, а во втором — на добавление, изменение и удаление. В частности, для того, чтобы различить, есть ли изображение «по у сторону ссылки» или нет, можно воспользоваться проверкой атрибута gd:etag — если атрибута нет, то значит GET-запрос по ссылке вернет 404 код, т.к. изображение отсутствует.
Теперь, что касается форматов изображения. Google разрешает нам грузить на сервер изображение в форматах GIF, JPG и PNG. Однако, тело GET-запроса всегда возвращает один и тот же формат — JPEG. Я провел небольшой эксперимент: устанавливал для контакта фотографии во всех трех форматах и пробовал каждый раз загрузить фотку с сервера и вставить в TImage. Во всех трех случаях заголовок ответного сообщения содержал следующую информацию:

HTTP/1.0 200 OK
Content-Type: image/jpeg
Cache-Control: private, max-age=0, must-revalidate, no-transform
Vary: Accept, X-GData-Authorization, GData-Version
GData-Version: 3.0
ETag: "fCt7ImBoW1MUZxp0AUEmInJ-Q1U...."
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Server: GFE/2.0

И это обстоятельство (один и тот же формат) упрощает нам жизнь — нет необходимости определять, что за формат нам возвращается, чтобы создать подходящий объект в Delphi. Остается реализовать простой алгоритм:
1. Найти ссылку на изображение для Контакта;
2. Если link содержит атрибут gd:etag, то грузим фотку или отправляем запрос на изменение/удаление изображения.
3. Если изображение загружено, то показываем его пользователю.
Кстати, если Вы используете Synapse, то при загрузке изображения не забывайте переместить курсор потока на 0, т.е.:

uses jpeg;
[...]
var Picture: TJPEGImage;
with THTTPSend.Create do
    begin
      //заполняем заголовки
      Headers.Add('GData-Version: 3.0');
      Headers.Add('Authorization: GoogleLogin auth='+aAuth);
      MimeType := 'application/atom+xml';  
      [...]
      if HTTPMethod('GET',URL_на_изображение) then
         begin
            Picture:=TJPEGImage.Create;//создаем объект
            Document.Seek(0,soFromBeginning);//обязательно смещаемся на 0
            Picture.LoadFromStream(Document);
            Image1.Picture.Assign(Picture);//показываем пользователю
         end;
  end;
[...]

Если не смещаться на 0, то при выполнении Assign получите вместо картинки «JPEG error #42».

0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
3 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Алексей
Алексей
08/04/2010 22:32

Vlad, вы постоянно меня удивляете!! Где вы берете всю информацию.
А есть ли возможность создавать задачи в календаре?
И еще в вашей программе по работе с мероприятиями неверно указывается дата события у повторяющихся мероприятий.
И вот еще, что, каким образом можно приложить файл к мероприятию.
Извиняюсь за большое количество вопросов, просто интересная тема!
Спасибо.

Алексей (Тамбов)
Алексей (Тамбов)
09/04/2010 11:38

Спасибо за ответ.