Подписка

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

Наши проекты

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 2 июля 2010 в 12:56.
Категории: Delphi в Web.


Сегодня затронем ещё один момент по работе с Google API в Delphi, а именно - посмотрим как необходимо правильно обновлять имя контакта.
Узнать имя контакта можно двумя способами:

  1. Через содержимое узла title. При этом значение узла может собержать как полное имя, например, "Иванов Иван Иванович", так и сокращенные вариант (только имя, только фамилия, фамилия и инициалы и т.д.)
  2. Через значения, содержащиеся в дочерних узлах gd:name. gd:name содержит структурированную информацию по контакту, такую как имя, фамилия, отчество и дополнительные элементы, такие как префик имени и т.д.

В данных о контакте элемент gd:name может отсутствовать.

Как может показаться на первый взгляд, наиболее просто и быстро узнать имя контакта, просто прочитав значение title и присвоив его какой-нибудь переменной. Однако на деле при таком подходе все может оказаться не так просто и гладко.
Дело в том, что если мы захотим обновиться имя контакта, то нам в любом случае необходим узел gd:name в отпраляемом документа. При выполнении PUT-запроса на обновление данных Google обновляет данные по следующей (примерной) схеме:
1. Проверяется валидность XML-докумена, если документ содержит ошибки обновление не производится.
2. Обновляется каждое поле контакта. При этом, если в XML-документе, содержатся "лишние" узлы, например, link с даными об изображении, то такие узлы просто игнорируются.
3. Если XML содержит узел gd:name, то вначале вносятся изменения имени контакта, а затем содержимое этого узла дублируется в узле title ответного документа.
В этой же схеме "лишним" оказывается и узел title. Проверить это можно достаточно просто. Берем контакт, например, такой:

<entry>
<id>http://www.google.com/m8/feeds/contacts/vlad383%40gmail.com/base/54cbb4f68a234171</id>
<updated>2010-07-02T08:56:03.938Z</updated>
<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/contact/2008#contact" />
<title>Иванов Иван Иванович</title>
<content>Примечание</content>
<gd:name>
<gd:fullName>Иванов Иван Иванович</gd:fullName>
<gd:givenName>Иванов</gd:givenName>
<gd:additionalName>Иван</gd:additionalName>
<gd:familyName>Иванович</gd:familyName>
</gd:name>
<gContact:nickname>Vanusha</gContact:nickname>
<gContact:birthday when="1983-05-02" />
<gd:email rel="http://schemas.google.com/g/2005#other" address="vanya@gmail.com" primary="true" />
</entry>

Как видите, контакт содержит и title и gd:name. Пробуем изменить имя контакта с помощью узла title - для этого формируем такой документ:

<entry>
<id>http://www.google.com/m8/feeds/contacts/vlad383%40gmail.com/base/54cbb4f68a234171</id>
<updated>2010-07-02T08:56:03.938Z</updated>
<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/contact/2008#contact" />
<title>Новое имя контакта</title>
<content>Примечание</content>
<gd:name>
<gContact:nickname>Vanusha</gContact:nickname>
<gContact:birthday when="1983-05-02" />
<gd:email rel="http://schemas.google.com/g/2005#other" address="vanya@gmail.com" primary="true" />
</entry>

И отправляем этот документ на сервер, используя PUT-запрос. Ответный документ будет таким:

<entry>
<id>http://www.google.com/m8/feeds/contacts/vlad383%40gmail.com/base/54cbb4f68a234171</id>
<updated>2010-07-02T08:56:03.938Z</updated>
<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/contact/2008#contact" />
<title/>
<content>Примечание</content>
<gd:name>
<gContact:nickname>Vanusha</gContact:nickname>
<gContact:birthday when="1983-05-02" />
<gd:email rel="http://schemas.google.com/g/2005#other" address="vanya@gmail.com" primary="true" />
</entry>

Что и требовалось доказать - title в отправляемом нами документе проигнорировался. Правильным был бы такой документ:

<entry>
<id>http://www.google.com/m8/feeds/contacts/vlad383%40gmail.com/base/54cbb4f68a234171</id>
<updated>2010-07-02T08:56:03.938Z</updated>
<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/contact/2008#contact" />
<content>Примечание</content>
<gd:name>
<gd:fullName>New User</gd:fullName>
<gd:givenName>User</gd:givenName>
<gd:familyName>New</gd:familyName>
</gd:name>

<gContact:nickname>Vanusha</gContact:nickname>
<gContact:birthday when="1983-05-02" />
<gd:email rel="http://schemas.google.com/g/2005#other" address="vanya@gmail.com" primary="true" />
</entry>

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

В общем случае узел gd:name может содержать следующую информацию (в дочерних узлах):

  1. gd: GivenName - имя
  2. gd:additionalName - дополнительное имя, в нашем случае - отчество
  3. gd:familyName - фамилия
  4. gd: namePrefix - префикс, например, "Мистер"
  5. gd: nameSuffix - суфикс, например "III" или "Сан"
  6. gd:fullName - неструктурированное полное имя, например "Иванов Иван Иванович"

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

  1. Получаем XML-документ с информацией о контакте
  2. Если контакт содержит узел gd:name, то парсим его содержимое и составляем имя контакта, иначе пробуем прочиать title.
  3. Если документ содержит только title, то:
    1. Принимаем за имя контакта значение title
    2. При обновлении обязательно включаем gd:name в документ. Если имя контакто было взято из title, то во избежание лишних проблем это имя следует записать в gd:name -->gd:fullName.

Ну и последнее, что хотелось бы отметить в плане работы с Google API, так это то, что никогда не следует забывать, что имена узлов чувствительны к регистру. Например узел gd:NaMe будет проигнорирован при обработке запроса.

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

Ваш ответ

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

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