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

Решил я сегодня начать исправление всех допущенных ошибок в модуле для работы с 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? Буду благодарен, если поделитесь своими мыслями на этот счёт.

Книжная полка

Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
купить книгу delphi на ЛитРес
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
купить книгу delphi на ЛитРес
0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
2 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Jos-D
Jos-D
01/12/2010 18:56

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.