Получение push-уведомлений Google Диска
Мне удалось установить канал для получения push-уведомлений с Google Диска, используя метод, описанный здесь. Почему я не получаю уведомления от webhook с диска?, Я получаю уведомления, и все работает нормально. Моя проблема в том, что когда я получаю push-уведомления, я получаю только эту информацию:
Content-Length: 0
Accept: */*
Accept-Encoding: gzip,deflate,br
Connection: Keep-alive
Host: www.domain.com
User-Agent: APIs-Google; (+https://developers.google.com/webmasters/APIs-Google.html)
X-Goog-Channel-Expiration: Thu, 29 Dec 2016 00:00:00 GMT
X-Goog-Channel-Id: 01ecb23c-e718-8674-6ab3-623931741334
X-Goog-Message-Number: 2745870
X-Goog-Resource-Id: hw75x654x56jYhRNkfU5CFEXXXhtlj8
X-Goog-Resource-State: change
X-Goog-Resource-Uri: https://www.googleapis.com/drive/v3/changes?includeRemoved=true&pageSize=100&pageToken=658&restrictToMyDrive=false&spaces=drive&alt=json
Согласно этой документации, есть несколько уведомлений "Изменить", которые содержат тело запроса. К сожалению, я не смог получить тело запроса.
Сценарий, обрабатывающий push-уведомления, имеет следующую логику:
$oldcontent = file_get_contents('notifications.txt');
$newnotsfile = fopen("notifications.txt", "w");
$post = file_get_contents('php://input');
$requestBody = json_decode($post , TRUE); //convert JSON into array
$time = date("Y-M-d H:i:s", time());
fwrite($newnotsfile , "<br><br>---------------- │ Time: ".$time."<br><br>");
foreach (getallheaders() as $name => $value) {
fwrite($newnotsfile , $name.": ".$value."<br>");
}
fwrite($newnotsfile , $requestBody );
fwrite($newnotsfile , "<br><br>");
fwrite($newnotsfile , $oldcontent);
fclose($newnotsfile );
?>
Я думал, что с помощью $post = file_get_contents('php://input');
Я бы захватил тело запроса, но правда в том, что он ничего не захватывает. Если я правильно понимаю, я должен получить ресурс изменений со структурой, подробно описанной здесь. Что-то не так, что я делаю, или я понял это неправильно? Я ценю любую информацию, которая может быть дана, и спасибо заранее!
2 ответа
На самом деле нет тела запроса, которое отправляется в уведомлении webhook. Поэтому, как только изменения поступят в URL обратного вызова, изменения должны быть получены путем создания запроса get для изменения ресурса URI, как показано ниже
Resource URI : https://www.googleapis.com/drive/v3/changes?includeRemoved=true&pageSize=100&pageToken=895&restrictToMyDrive=false&spaces=drive&alt=json
Или программно изменения могут быть получены с помощью приведенного ниже кода
String pageToken = channelInfo.getCurrPageToken();
List<Change> changes = service.changes().list(pageToken)
.execute().getChanges();
Документ push-уведомлений Google мог бы упомянуть об этом явно, а не упомянуть, что изменения происходят в теле запроса, что является причиной путаницы
Возможно, вы захотите проверить документацию - Push-уведомления, здесь описано, как использовать push-уведомления, которые информируют ваше приложение об изменении ресурса.
Смотреть ответ
Если запрос наблюдения успешно создает канал уведомления, он возвращает HTTP
200 OK
код состояния.Тело сообщения ответа о просмотре предоставляет информацию о канале уведомлений, который вы только что создали, как показано в примере ниже.
{
"kind": "api#channel",
"id": "01234567-89ab-cdef-0123456789ab"", // ID you specified for this channel.
"resourceId": "o3hgv1538sdjfh", // ID of the watched resource.
"resourceUri": "https://www.googleapis.com/drive/v3/files/o3hgv1538sdjfh", // Version-specific ID of the watched resource.
"token": "target=myApp-myFilesChannelDest", // Present only if one was provided.
"expiration": 1426325213000, // Actual expiration time as Unix timestamp (in ms), if applicable.
}
И если вы проверите Понимание формата уведомлений:
Уведомления для файлов и изменений пусты.
Документы также предоставили образцы:
Уведомление об изменении ресурсов файлов, которое не включает тело запроса:
POST https://example.com/notifications // Your receiving URL.
Content-Type: application/json; utf-8
Content-Length: 0
X-Goog-Channel-ID: 4ba78bf0-6a47-11e2-bcfd-0800200c9a66
X-Goog-Channel-Token: 398348u3tu83ut8uu38
X-Goog-Channel-Expiration: Tue, 19 Nov 2013 01:13:52 GMT
X-Goog-Resource-ID: ret08u3rv24htgh289g
X-Goog-Resource-URI: https://www.googleapis.com/drive/v3/files/ret08u3rv24htgh289g
X-Goog-Resource-State: update
X-Goog-Changed: content,properties
X-Goog-Message-Number: 10
Уведомление об изменении ресурсов Changes, которое включает тело запроса:
POST https://example.com/notifications // Your receiving URL.
Content-Type: application/json; utf-8
Content-Length: 118
X-Goog-Channel-ID: 8bd90be9-3a58-3122-ab43-9823188a5b43
X-Goog-Channel-Token: 245t1234tt83trrt333
X-Goog-Channel-Expiration: Tue, 19 Nov 2013 01:13:52 GMT
X-Goog-Resource-ID: ret987df98743md8g
X-Goog-Resource-URI: https://www.googleapis.com/drive/v3/changes
X-Goog-Resource-State: changed
X-Goog-Message-Number: 23
{
"kind": "drive#changes"
}
Понимание событий уведомления Drive API
В этом разделе содержатся подробные сведения об уведомлениях, которые вы можете получить при использовании push-уведомлений с Drive API.
Вы можете опробовать любое из перечисленных ниже событий на игровой площадке Push Notifications или загрузить исходный код с GitHub.
Надеюсь, эта информация поможет.