Получение 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.

Надеюсь, эта информация поможет.

Другие вопросы по тегам