Получение XML всех ресурсов Календаря Google в домене?

В настоящее время я работаю над формой на PHP, которая объединит две разные задачи: резервирование места для события и регистрация события для онлайн-календаря. У меня есть часть Календаря Google, прибитая клиентом API для PHP, но Ресурсы календаря все еще оказывается проблемой.

Вот некоторая информация о том, где я сейчас нахожусь:

  • Я использую общий API для обработки авторизации OAuth2 в областях «Календарь» и «Ресурс».
  • Я использую токен доступа, чтобы сделать запрос cURL GET к фиду ресурсов в попытке извлечь данные XML по всем доступным
    Ресурсы.

  • Предполагая, что вышесказанное сработало, я бы использовал электронные письма с ресурсами, извлеченные из XML, чтобы пригласить выбранные ресурсы на событие, созданное с помощью Calendar API.

Моя текущая дилемма связана с данными, которые я вернул после звонка. Когда я использую Google OAuth2 Playground чтобы сделать запрос с указанными выше URI, он извлекает данные XML без проблем. Когда я делаю ту же попытку в PHP, я получаю данные в одной строке в следующем формате:

Я знаю, что каждый запрос будет возвращать только 100 ресурсов за запрос, и игровая площадка и мой php возвращают то, что выглядит как 100 записей, так что это не обязательно является проблемой авторизации. При этом я не уверен, что буду делать иначе, чем на детской площадке.

Мой запрос cURL следующий (однажды получая access_token):

$url = 'https://apps-apis.google.com/a/feeds/calendar/resource/2.0/domain/';

$token = json_decode($_SESSION['access_token'], true);
$access_token = $token['access_token'];
$token_type = $token['token_type'];

//open connection
$ch = curl_init();

curl_setopt_array($ch, array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_URL => $url,
CURLOPT_HTTPHEADER => array('Authorization: '.$token_type.' '.$access_token,),
));

// $output contains the returned data
$output = curl_exec($ch);

if($output === false) { echo 'Curl error: ' . curl_error($ch); }
else { echo $output; }

// close curl resource to free up system resources
curl_close($ch);

Есть что-то, настройка cURL или заголовок, который мне не хватает? Я не могу догадаться, что это будет, особенно когда запрос Playground следующий:

GET /a/feeds/calendar/resource/2.0/domain/ HTTP/1.1
Host: apps-apis.google.com
Content-length: 0
Authorization: Bearer access_token

ОБНОВИТЬ

Ответ Ханса З. побудил меня (спасибо!) Искать способы поместить данные XML в массив, поскольку мне нужно использовать полученные данные, а не отображать их. (Мои извинения за то, что не разъяснили это изначально.) Есть много постов на эту тему, и после помещения вывода через SimpleXML, я получаю следующее как запись для каждого ресурса (x100):

[0] => SimpleXMLElement Object
(
[id] => https://apps-apis.google.com/a/feeds/calendar/resource/2.0/domain/579841149621
[updated] => 2015-02-18T17:04:16.481Z
[link] => Array
(
[0] => SimpleXMLElement Object
(
[@attributes] => Array
(
[rel] => self
[type] => application/atom+xml
[href] => https://apps-apis.google.com/a/feeds/calendar/resource/2.0/domain/579841149621
)
)

[1] => SimpleXMLElement Object
(
[@attributes] => Array
(
[rel] => edit
[type] => header('Content-type: application/xml');
[href] => https://apps-apis.google.com/a/feeds/calendar/resource/2.0/domain/579841149621
)
)
)
)

Как показано выше, это не предоставляет никакой информации о самом ресурсе, таком как его имя или адрес электронной почты (или идентификатор, любым прямым способом без разбора). Я попытался запустить вывод XML с игровой площадки через SimpleXML и возрождаю точно такой же вывод. Предполагая, что это что-то с SimpleXML, я сделал еще несколько поисков и наткнулся этот вопрос, этот вопрос, а также этот блог. Я сам возился с тем, что они предлагают, но пока без особого успеха. Если кто-то хотел бы выяснить это до меня (поскольку я должен посещать собрания большую часть этого дня), вот пример структуры XML:

<feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:apps='http://schemas.google.com/apps/2006'>
<id>https://apps-apis.google.com/a/feeds/calendar/resource/2.0/domain</id>
<updated>2015-02-18T17:03:03.057Z</updated>
<link rel='next' type='application/atom+xml' href='https://apps-apis.google.com/a/feeds/calendar/resource/2.0/domain/?start=579841149621'/>
<link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://apps-apis.google.com/a/feeds/calendar/resource/2.0/domain'/>
<link rel='http://schemas.google.com/g/2005#post' type='application/atom+xml' href='https://apps-apis.google.com/a/feeds/calendar/resource/2.0/domain'/>
<link rel='self' type='application/atom+xml' href='https://apps-apis.google.com/a/feeds/calendar/resource/2.0/domain'/>
<openSearch:startIndex>1</openSearch:startIndex>

<entry>
<id>https://apps-apis.google.com/a/feeds/calendar/resource/2.0/domain/579841149621</id>
<updated>2015-02-18T17:03:03.056Z</updated>
<link rel='self' type='application/atom+xml' href='https://apps-apis.google.com/a/feeds/calendar/resource/2.0/domain/579841149621'/>
<link rel='edit' type='application/atom+xml' href='https://apps-apis.google.com/a/feeds/calendar/resource/2.0/domain/579841149621'/>

<apps:property name='resourceId' value='579841149621'/>
<apps:property name='resourceCommonName' value='Projector'/>
<apps:property name='resourceEmail' value='[email protected]'/>
</entry>

//99 more times:
<entry>
...
</entry>

1

Решение

Ваш скрипт работает нормально, но вы смотрите на вывод скрипта в браузере. Браузер попытается проанализировать вывод XML как HTML, что приведет к наблюдаемому результату. Измените код так, чтобы он указывал браузеру, что ответом является XML следующим образом:

header('Content-type: application/xml');
if($output === false) { echo 'Curl error: ' . curl_error($ch); }
else { echo $output; }

или посмотрите на вывод, используя интерпретатор PHP командной строки.

Редактировать:

Возможно, вам будет удобнее анализировать JSON в PHP; Вы можете получить результаты в JSON, добавив alt=json на запрос как в:

https://apps-apis.google.com/a/feeds/calendar/resource/2.0/<domain>/?alt=json

и применить $output = json_decode($output) на выход; Вы можете получить доступ к необходимым данным, например, адрес электронной почты первого ресурса, как указано ниже:

$output->feed->entry[0]->{'apps$property'}[2]->value
1

Другие решения

Ниже приведено альтернативное решение, данное Хансом З. для тех, кто предпочитает работать с ресурсами как с массивами:

$array = json_decode($output, true);
$resources = $array['feed']['entry'];

foreach ($resources as $resource) {
$id = $resource['apps$property']['0']['value'];
$name = $resource['apps$property']['1']['value'];
$email = $resource['apps$property']['2']['value'];

//do something with data
}
0

По вопросам рекламы [email protected]