Подписка

добавить на Яндекс

Наши проекты

Delphi+Google

Google API

Google API в Delphi - проект с открытым исходным кодом.

Chrono

Chrono

Хронометр - программа для ведения списка задач.

ODFProc

ODFProc

ODFProc - работа с документами OpenOffice в Lazarus и FreePascal.

Поддержка блога

А тут я коплю на лицензию Delphi XE на iPad =).
Сумма пожертвования не фиксирована.

Публикации

Год назад

Случайный пост

Последние

Сообщения форума

Комментарии

Социальные сети

Google

Facebook

Twitter

Опрос

Вы сейчас или в ближайшем обозримом будущем планируете разрабатывать кроссплатформенное приложение с использованием Firemonkey?



Loading ... Loading ...

Блоги и сообщества

Статьи по Delphi DelphiFeeds.ru - Все Delphi-блоги Рунета Сообщество умных людей VR-Online.RU Бесплатный журнал для программистов и всех, кто интересуется IT Статьи и уроки по Delphi Новостной блог о высоких технологиях
Система Orphus
Опубликовал Vlad 8 апреля 2010 в 16:30.
Категории: Delphi в Web.


Затеял я на днях поработать с 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".

------------------
Для успешной работы в Сети необходимо иметь раскрученный сайт. Если вы не знаете как продвигать сайт в поисковых системах, то специально для Вас продвижение сайта от NetPeak. Доверьте Ваш сайт профессионалам и не забивайте себе голову вопросами SEO - лучше занимайтесь непосредственными целями своего проекта.
------------------
Понравилась статья? Тогда:
Делись! Загружай! Плюсуй!
   Отправить PDF на   
Читай ещё статьи на WebDelphi.ru

Комментарии (3)

WP_Cloudy
  • Алексей пишет:

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

  • Vlad пишет:

    Информация черпается в основном как раз с Гуглокода :) API Календаря пока не предусматривает возможности создания задач в Календарях, думаю, что в скором времени доработают эту часть, тогда смогу дописать модуль.
    По поводу даты мероприятий..да есть акая проблема, сам её заметил буквально недавно. Исправим.
    По поводу того как прицепить файл к мероприятию, пока даже не смотрел возможно ли это в принципе, используя API. Думаю, если такая возможность при работе с календарями есть, то в API она должна как-то фигурировать.

  • Алексей (Тамбов) пишет:

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

Ваш ответ

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

Пожалуйста, заключайте исходный код в тэги [code][/code].
Если код большой, то воспользуйтесь Вставкой кода на отдельной странице и оставьте в комментарии ссылку на исходник