Подписка

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

Наши проекты

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 30 июня 2010 в 23:15.
Категории: Delphi в Web.


Решил я сегодня начать исправление всех допущенных ошибок в модуле для работы с Google Contacts и дописать несколько методов по добавлению нового контакта в адресную книгу.
В целом при исправлении ошибок удалось также немного ускорить работы по чтению данных о контактах. Раньше на чтение 60 контактов требовалось порядка 7 секунд, сегодня сократил до 4 и, полагаю, что это далеко не предел.
В целом добавление нового контакта в адресную книгу практически не отличается от обновления контакта или добавления нового события в Календарь. Смысл достаточно прост - создается XML-документ с корневым элементом "atom:entry" в документ заносятся все данные о контакте и выполняется простенький POST-запрос на определенный URL. Однако один момент при выполнении этой операции немного загнал меня в ступор.

Началось все с того, что я составил необходимый XML-документ с данными о контакте и решил его отправить на сервер - проверить создатся ли новый контакт. Обычно, если возникает ошибка, Google кратенько, но очень доходчиво сообщает в чем проблема, например, говорит (на чисто английском), что какой-либо префикс узла не согласован с существующей схемой документа или какой-то обязательный узел отсутствует и т.д. А тут вдруг возвращается ошибка выполнения метода POST. Т.к. в английском не силен (а зря), то загоняю текст ошибки в ГуглоПереводчик и он дословно выдает мне вот такую бяку:

POST метод не поддерживает параллелизм

Что за параллелизм нашел Google в моем пушистом методе я не знаю, но решение оказалось куда более простым нежели сообщение об ошибке - в заголовке запроса оказалась скопипастенныя строка вида:

If-Match...

Убрал этот заголовок - парллелизм исчез :).
Отсюда два вывода:

  1. Надо в срочном порядке вспоминать английский так как я его знал в универе.
  2. Копипаст - зло :)

Ну и третий - это, конечно, "дерьмо случается", но это уже закон нежели вывод.

Теперь, что в целом касается добавления нового контакта в адресную книгу. В документации по протоколу Вы можете встретить вот такой пример документа, содержащего сведения о новом контакте:

<atom:entry xmlns:atom='http://www.w3.org/2005/Atom'
    xmlns:gd='http://schemas.google.com/g/2005'>
  <atom:category scheme='http://schemas.google.com/g/2005#kind'
    term='http://schemas.google.com/contact/2008#contact' />
  <gd:name>
     <gd:givenName>Elizabeth</gd:givenName>
     <gd:familyName>Bennet</gd:familyName>
     <gd:fullName>Elizabeth Bennet</gd:fullName>
  </gd:name>
  <atom:content type='text'>Notes</atom:content>
  <gd:im address='liz@gmail.com'
    protocol='http://schemas.google.com/g/2005#GOOGLE_TALK'
    primary='true'
    rel='http://schemas.google.com/g/2005#home' />
</atom:entry>

То есть, как видите документ в формате Atom и содержит только узлы gd и общие, типа "content". В целом, узлов GData должно хватить на то, чтобы максимально полно описАть новый контакт. Однако, если всё же требуется отправить сразу же сведения, например, о сайтах пользоватяле, его ник в Сети и т.д., то в документ можно включить элементы Google Contacts Data API. Для этого требуется всего лишь немного видоизменить корневой узел, а именно добавить вот такое пространство имен:

xmlns:gContact="http://schemas.google.com/contact/2008"

и после этого вписывать в документ все, что хочется за исключением URL фотографии - фото, согласно правилам редактируется только после добавления контакта.
Кстати говоря, возвращаясь к "параллелизму". Пока дописывал добавление нового контакта, натолкнулся на одну возможность Google API, которую, почему-то раньше обходил стороной - пакетную обработку данных (Batch Processing in the Google Data Protocol). Классная вещь. Особенно когда требуется провести большое количество операций, например, удалить 40 контактов, добавить 10 событий в календарь и ещё и запостить пост в blogger. Batch Processing позволяет за раз скинуть на сервер сведения по 100 операциям вставки, обновления, удаления или получения данных. Полагаю, что использование этого механизма Google API может сохранить много времени, тем более, что то же добавление контакта проходит через Batch (судя по содержимому ответа).
Вот теперь думаю, как бы сподобится и написаь небольшой модуль по работе с этим механизмом и использовать его в GContacts и GCalendar.
Может у кого-нибудь уже есть наработки в плане Batch Processing? Буду благодарен, если поделитесь своими мыслями на этот счёт.

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

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

WP_Cloudy
  • Jos-D пишет:

    Hey
    I ported gcontact and gCalendar to delphi7.
    Great stuff and it’s working fine :-)
    Now I working on a bacht for gCalendar.
    I wondering  if you can give me somme clues to proceed?
    Greetings from Belgium.
    Sory but i don’t understand Russian.

  • Vlad пишет:

    Say what you will need to work. I will try to help:)

Ваш ответ

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

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