Затеял я на днях поработать с 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».
Vlad, вы постоянно меня удивляете!! Где вы берете всю информацию.
А есть ли возможность создавать задачи в календаре?
И еще в вашей программе по работе с мероприятиями неверно указывается дата события у повторяющихся мероприятий.
И вот еще, что, каким образом можно приложить файл к мероприятию.
Извиняюсь за большое количество вопросов, просто интересная тема!
Спасибо.
Информация черпается в основном как раз с Гуглокода :) API Календаря пока не предусматривает возможности создания задач в Календарях, думаю, что в скором времени доработают эту часть, тогда смогу дописать модуль.
По поводу даты мероприятий..да есть акая проблема, сам её заметил буквально недавно. Исправим.
По поводу того как прицепить файл к мероприятию, пока даже не смотрел возможно ли это в принципе, используя API. Думаю, если такая возможность при работе с календарями есть, то в API она должна как-то фигурировать.
Спасибо за ответ.