В пакетных фидах версия объекта определяется с помощью поля dateModified
в конверте фида:
{
"@context": "http://schema.googleapis.com",
"dateModified": "2018-12-28T06:30:00:123-07:00",
"@type": "DataFeed",
"dataFeedElement": [
/* All the items that are part of this feed go here */
]
}
Все сущности, перечисленные в поле dataFeedElement
будут иметь ту же метку времени, которая указана в конверте.
Например, у вас может быть следующий фид с двумя объектами:
{
"@context": "http://schema.googleapis.com",
"@type": "DataFeed",
"dateModified": "2018-12-28T06:30:00:123-07:00",
"dataFeedElement": [
{
"@type": "Restaurant",
"@id": "http://www.provider.com/somerestaurant",
...
},
{
"@type": "Menu",
"@id": "http://www.provider.com/somerestaurant/menu/1"
...
}
]
}
И меню, и объекты ресторана после получения и обработки будут иметь индивидуальную версию «2018-12-28T06:30:00:123-07:00».
Управление версиями с инкрементными обновлениями
При отправке сущности с помощью обновлений инвентаря версия устанавливается через поле update_time
(в случае вызова добавления/обновления) или поле delete_time
(в случае вызова удаления). Поскольку эти поля являются необязательными, временная метка по умолчанию устанавливается на момент получения звонка от Google.
Пример 1: update_time явно задано
Предположим, что в 2018-12-28T06:30:10:123-07:00 получен следующий добавочный вызов для совершенно нового ресторана. Вот запрос HTTP POST для этого объекта с идентификатором «http://www.provider.com/somerestaurant», предполагая, что канал данных использует схему инвентаризации v1:
POST v2/apps/provider-project/entities/http%3A%2F%2Fwww.provider.com%2Fnewrestaurant:push
Host: actions.googleapis.com
Content-Type: application/ld+json
Ниже тело полезных данных JSON содержит поле update_time
. Сущность с идентификатором «http://www.provider.com/somerestaurant» приводит к тому, что эта сущность имеет версию 6:30:00, а не время ее получения (десять секунд спустя в 6:30:10):
{
// This envelope is to be used for incremental.
"entity": {
// Note: "data" is not serialized as a string in our example for readability.
"data": "[entity in JSON format serialized as a string]",
"vertical": "FOODORDERING"
},
"update_time":"2018-12-28T06:30:00:123-07:00"
}
Пример 2: update_time установлен неявно
Предположим, что в 2018-12-28T06:30:10:123-07:00 получен следующий добавочный вызов для совершенно нового ресторана. Вот запрос HTTP POST для этого объекта с идентификатором «http://www.provider.com/somerestaurant», предполагая, что канал использует схему инвентаризации v1:
POST v2/apps/provider-project/entities/http%3A%2F%2Fwww.provider.com%2Fnewrestaurant:push
Host: actions.googleapis.com
Content-Type: application/ld+json
Ниже тело полезных данных JSON не содержит поля update_time
. Таким образом, объект с идентификатором «http://www.provider.com/somerestaurant» приводит к тому, что этому объекту присваивается версия 6:30:10:
{
// This envelope is to be used for incremental.
"entity": {
//Note: "data" is not serialized as a string in our example for readability.
"data": "[entity in JSON format serialized as a string]",
"vertical": "FOODORDERING"
}
}
Управление версиями между пакетным и инкрементальным
Объект, отправленный в Google, обрабатывается и обслуживается только в том случае, если он имеет последнюю версию. Обратите внимание, что обработка объектов, отправленных в пакетном режиме, обычно занимает несколько дней, тогда как объекты, отправленные через инкрементный API, обрабатываются немедленно.
Лучшие практики
- Установите поля
update_time
иdateModified
в инкрементном и пакетном режиме соответственно в зависимости от того, когда объект был изменен в ваших системах. - Если в пакетном фиде (файле) указано более одного объекта верхнего уровня (например, вы связываете свои рестораны с услугами и меню), обновите метку времени по мере обновления данных объекта.
- При инкрементных вызовах мы настоятельно рекомендуем явно устанавливать поле
update_time
. - Крайне важно, чтобы после выполнения добавочного вызова соответствующая временная метка фида (
dateModified
) также обновлялась, прежде чем Google снова получит ее.
Пример
Google извлекает следующий файл в 11 утра 28 декабря 2018 г. для совершенно нового ресторана:
{
"@context": "http://schema.googleapis.com",
"@type": "DataFeed",
"dateModified": "2018-12-28T06:30:00-07:00",
"dataFeedElement": [
{
"@type": "Restaurant",
"@id": "http://www.provider.com/newrestaurant",
...
},
{
"@type": "Menu",
"@id": "http://www.provider.com/newrestaurant/menu/1"
...
}
{
"@type": "Service",
"@id": "http://www.provider.com/newrestaurant/service/1"
...
}
]
}
Эти объекты успешно обрабатываются и имеют версию «2018-12-28T06:30:00-07:00». Поскольку обработка пакетных фидов требует времени, они обычно доставляются через 2 дня.
Однако в 13:00 в системе партнера появляется обновление телефонного номера ресторана, что приводит к следующему дополнительному звонку, который Google получает в 13:05 (5 секунд спустя):
POST v2/apps/provider-project/entities/http%3A%2F%2Fwww.provider.com%2Fnewrestaurant:push
Host: actions.googleapis.com
Content-Type: application/ld+json
{
// This envelope is to be used for incremental.
"entity": {
//Note: "data" is not serialized as a string in our example for readability.
"data": "[entity in JSON format serialized as a string]",
"vertical": "FOODORDERING"
},
"update_time":"2018-12-28T13:00:00-07:00"
}
update_time
указывается явно и больше (более поздний), чем предыдущая версия (6:30 утра того же дня), поэтому версия объекта ресторана теперь имеет вид «2018-12-28T13:00:00-07:00». ". Однако версии меню и сервисных объектов по-прежнему имеют версию «2018-12-28T06:30:00-07:00».
Произошел добавочный вызов, поэтому пакетный канал обновляется с использованием новой соответствующей временной метки. Также соответствующие изменения применяются к соответствующим объектам (у объекта-ресторана обновляется номер телефона).
{
"@context": "http://schema.googleapis.com",
"@type": "DataFeed",
"dateModified": "2018-12-28T13:00:00-07:00",
"dataFeedElement": [
{
"@type": "Restaurant",
"@id": "http://www.provider.com/newrestaurant",
...
},
{
"@type": "Menu",
"@id": "http://www.provider.com/newrestaurant/menu/1"
...
}
{
"@type": "Service",
"@id": "http://www.provider.com/newrestaurant/service/1"
...
}
]
}
На следующий день (29 декабря 2018 г.) в 23:00 канал снова загрузится. В ресторане все еще используется та же версия (28 декабря в 13:00), поэтому этот объект удаляется и сохраняется текущая версия. Однако объекты «Меню» и «Сервис» обновлены до новой версии.
Временные метки карты сайта
last-modified
заголовок ответа в карте сайта не влияет на версию объекта. Это влияет на то, когда Google получает канал.
Лучшие практики
- Обновляйте заголовок ответа только тогда, когда все файлы обновлены и готовы к загрузке.
- Явно используйте
update_time
иdelete_time
в инкрементальном режиме. - Установите
update_time
,delete_time
иdateModified
на момент изменения данных на вашей стороне.