Краткий ответ: метод PROPFIND
является общим и должен включать тело, которое определяет, какую информацию сервер должен вернуть. Вы должны передать полезную нагрузку XML в теле запроса, который идентифицирует запрашиваемые вами свойства.
Получение URI адресных книг
В соответствии с Документами Google CardDav API ваш первый запрос является совершенным и перенаправит вас на ресурс адресной книги для текущего пользователя. Вот описание Google следующего шага:
Ваша клиентская программа может затем обнаружить основную адресную книгу, выполнив PROPFIND на addressbook-home-set
и найдя ресурсы addressbook
и collection
.
Позвольте мне распаковать это: ваш второй запрос должен запросить список ресурсов пользователя, найденных в месте, которое вы получили из первого запроса. Чтобы правильно выполнить этот запрос, вам нужно передать тело XML с запросом PROPFIND
, например:
PROPFIND https://www.googleapis.com/carddav/v1/principals/<my_email>/lists/default/
Authorization: Bearer ya29.***********************************************
Depth: 1
Content-Type: application/xml; charset=utf-8
<D:propfind xmlns:D="DAV:">
<D:prop>
<D:resourcetype />
<D:displayname />
</D:prop>
</D:propfind>
Здесь вы указываете свойства, которые вы хотите, чтобы сервер отвечал. Вы указываете свойство resourcetype
, потому что вас интересуют только ресурсы addressbook
или collection
, которые содержат контакты.
Этот запрос вернет список URI для ресурсов, из которых вы можете выбрать любой, имеющий тип ресурса addressbook
или collection
.
На данный момент у вас нет контактов или даже URI контактов. У вас есть список URI для адресных книг пользователя или коллекций контактов. (Как правило, есть только один из них, но их может быть много.)
Вы не спрашивали, как получить контакты пользователя, но я предполагаю, что это ваша конечная цель, и мы продолжим выполнение следующих шагов.
Получение URI контактов
Ваш следующий набор запросов будет запрашивать каждый из URI адресной книги для URI их контактов. Выполните цикл по каждому результату из предыдущего запроса и выполните еще один запрос PROPFIND
для URI с такой полезной нагрузкой:
REPORT <addressbook_uri>
Authorization: Bearer ya29.***********************************************
Content-Type: application/xml; charset=utf-8
<D:propfind xmlns:D="DAV:">
<D:prop>
<D:getetag />
<D:getcontenttype />
</D:prop>
</D:propfind>
Здесь мы запрашиваем тип содержимого каждого элемента, чтобы мы могли определить, является ли он типом VCard. VCards являются законными контактными данными.
Теперь вы можете отфильтровать этот набор результатов по contenttype == 'text/vcard'
, чтобы получить новый список URI, указывающих на каждый контакт в адресной книге пользователя.
О, чувак, мы так близко.
Получить контактные карточки VCards
Наконец, соберите свой список URI с фактическими контактными данными и запросите данные с сервера.
Здесь вы сделаете запрос addressbook-multiget
REPORT
для получения пакета контактов в вашем списке. Google не сообщает, сколько контактных URI вы можете включить в свой запрос. Обычно я ограничиваю свой запрос несколькими сотнями за раз.
1059 * Е.Г. *
REPORT <addressbook_uri>
Authorization: Bearer ya29.***********************************************
Content-Type: application/xml; charset=utf-8
<C:addressbook-multiget xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:carddav">
<D:prop>
<D:getetag/>
<C:address-data>
<C:allprop/>
</C:address-data>
</D:prop>
<D:href>/carddav/v1/principals/<my_email>/lists/default/contact1.vcf</D:href>
<D:href>/carddav/v1/principals/<my_email>/lists/default/contact2.vcf</D:href>
...
</C:addressbook-multiget>
Ответ будет содержать данные VCard для каждого из контактов, упакованные в XML. Изучите текст XML, а затем проанализируйте данные VCard, чтобы, наконец, получить ваши контактные данные.
Готово!
Ресурсы: