Сегодня затронем ещё один момент по работе с Google API в Delphi, а именно - посмотрим как необходимо правильно обновлять имя контакта.
Узнать имя контакта можно двумя способами:
- Через содержимое узла title. При этом значение узла может собержать как полное имя, например, "Иванов Иван Иванович", так и сокращенные вариант (только имя, только фамилия, фамилия и инициалы и т.д.)
- Через значения, содержащиеся в дочерних узлах 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 может содержать следующую информацию (в дочерних узлах):
- gd: GivenName - имя
- gd:additionalName - дополнительное имя, в нашем случае - отчество
- gd:familyName - фамилия
- gd: namePrefix - префикс, например, "Мистер"
- gd: nameSuffix - суфикс, например "III" или "Сан"
- gd:fullName - неструктурированное полное имя, например "Иванов Иван Иванович"
Любой из этих элементов может отсутствовать. В целом, при работе с именами контактов в Google Contacts API можно придерживаться следующей схемы:
- Получаем XML-документ с информацией о контакте
- Если контакт содержит узел gd:name, то парсим его содержимое и составляем имя контакта, иначе пробуем прочиать title.
- Если документ содержит только title, то:
- Принимаем за имя контакта значение title
- При обновлении обязательно включаем gd:name в документ. Если имя контакто было взято из title, то во избежание лишних проблем это имя следует записать в gd:name -->gd:fullName.
Ну и последнее, что хотелось бы отметить в плане работы с Google API, так это то, что никогда не следует забывать, что имена узлов чувствительны к регистру. Например узел gd:NaMe будет проигнорирован при обработке запроса.
Если у Вас не хватает времени на то, чтобы разрабатывать модули и компоненты для своих программ и Вы хотите пользоваться уже готовыми разработками, то загляните в библиотеку исходников. на realcode.ru, вполне возможно, что там вы найдете необходимый вам компонент Delphi
-----------------
| Делись! | Загружай! | Плюсуй! |
| | |









Свежие комментарии