В настоящее время я работаю над формой на PHP, которая объединит две разные задачи: резервирование места для события и регистрация события для онлайн-календаря. У меня есть часть Календаря Google, прибитая клиентом API для PHP, но Ресурсы календаря все еще оказывается проблемой.
Вот некоторая информация о том, где я сейчас нахожусь:
- Я использую общий API для обработки авторизации OAuth2 в областях «Календарь» и «Ресурс».
- Объем ресурса: https://apps-apis.google.com/a/feeds/calendar/resource/
- Я использую токен доступа, чтобы сделать запрос cURL GET к фиду ресурсов в попытке извлечь данные XML по всем доступным
Ресурсы.
- Ресурс Вызов: https://apps-apis.google.com/a/feeds/calendar/resource/2.0/домен/
- Предполагая, что вышесказанное сработало, я бы использовал электронные письма с ресурсами, извлеченные из XML, чтобы пригласить выбранные ресурсы на событие, созданное с помощью Calendar API.
Моя текущая дилемма связана с данными, которые я вернул после звонка. Когда я использую Google OAuth2 Playground чтобы сделать запрос с указанными выше URI, он извлекает данные XML без проблем. Когда я делаю ту же попытку в PHP, я получаю данные в одной строке в следующем формате:
- https://apps-apis.google.com/a/feeds/calendar/resource/2.0/домен/5798411496212015-02-12T18:42:23.268Z
- «request_uri». «resource_id». «date_of_access» (x 100)
Я знаю, что каждый запрос будет возвращать только 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>
Ваш скрипт работает нормально, но вы смотрите на вывод скрипта в браузере. Браузер попытается проанализировать вывод 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
Ниже приведено альтернативное решение, данное Хансом З. для тех, кто предпочитает работать с ресурсами как с массивами:
$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
}