الإصدار 1 من تحديثات المستودع المتزايدة

يوضّح هذا القسم كيفية إرسال تحديثات لخلاصاتك في وقت محدَّد إلى Google. تتيح لك واجهة برمجة التطبيقات Incremental Updates API تعديل الكيانات في حسابك على الخلاصات في الوقت الفعلي تقريبًا.

هذه الوظيفة مخصصة في المقام الأول للتحديثات التي لا يمكنك توقعها، مثل عمليات الإغلاق الطارئة. كقاعدة عامة، إذا تم تغيير أي تغيير يتم إرساله من خلال يجب أن تكون واجهة برمجة تطبيقات التحديثات التزايدية تغييرًا يجب نشره خلال أسبوع واحد. إذا لم يكن التغيير بحاجة إلى أن ينعكس على الفور، يمكنك استخدام تحديثًا مجمّعًا بدلاً من ذلك. تتم معالجة التحديثات الإضافية في ما لا يزيد عن خمسة تحديثات. دقيقة.

ضبط إعدادات الجهاز

لتطبيق التحديثات التزايدية، يُرجى اتّباع الخطوات التالية:

  1. اتّبِع الخطوات الموضّحة في مقالة إنشاء مشروع وإعداده من أجل: وإنشاء مشروع.
  2. اتّبِع الخطوات الموضّحة في مقالة إعداد حساب خدمة. لإنشاء حساب خدمة. لاحظ أنه يجب أن تكون "مالكًا" من المشروع لإضافة "محرر" دور حساب الخدمة
  3. (اختياري، ولكن يُنصح به) تثبيت مكتبة برامج Google باللغة التي تختارها لتسهيل استخدام OAuth 2.0 عند استدعاء واجهة برمجة التطبيقات. وتستخدم عيّنات التعليمات البرمجية أدناه هذه المكتبات. خلاف ذلك، سوف معالجة عمليات تبادل الرموز المميّزة يدويًا كما هو موضّح في استخدام OAuth 2.0 للوصول إلى Google APIs.

نقطة نهاية

لإعلام Google بالتحديث، قدِّم طلب HTTP POST إلى واجهة Updates API وتتضمّن حمولة من التحديثات والإضافات. يحدّد مخطّط المستودع الذي تستخدمه نقطة النهاية التي يجب إرسال طلبك إليها:

الإصدار 2 من المستودع

https://actions.googleapis.com/v2/apps/PROJECT_ID/entities/TYPE/ENTITY_ID:push

مستودع الإصدار الأول

https://actions.googleapis.com/v2/apps/PROJECT_ID/entities/ENTITY_ID:push

لإزالة كيان، قدِّم طلب HTTP DELETE إلى نقطة النهاية التالية التي مع مخطط المستودع الذي تستخدمه:

الإصدار 2 من المستودع

https://actions.googleapis.com/v2/apps/PROJECT_ID/entities/TYPE/ENTITY_ID?entity.vertical=FOODORDERING&delete_time=DELETE_TIME

مستودع الإصدار الأول

https://actions.googleapis.com/v2/apps/PROJECT_ID/entities/ENTITY_ID?entity.vertical=FOODORDERING&delete_time=DELETE_TIME

في الطلبات أعلاه، استبدِل ما يلي:

  • PROJECT_ID: رقم تعريف مشروع Google Cloud المرتبط بالمشروع تم إنشاؤه في إنشاء مشروع وإعداده.
  • TYPE (مخطط مستودع الإصدار 2 فقط): نوع الكيان (موقع @type) للكائن في خلاصة البيانات الذي تريد تعديله
  • ENTITY_ID: رقم تعريف الكيان المدرَج في الحمولة احرص على ما يلي: يعمل عنوان URL على ترميز رقم تعريف الكيان.
  • DELETE_TIME (حذف نقطة النهاية فقط): حقل اختياري للإشارة إلى الوقت الذي تم فيه حذف الكيان على أنظمتك (الإعداد الافتراضي هو عندما يكون الطلب المستلمة). يجب ألا تكون قيمة الوقت في المستقبل. عند إرسال كيان من خلال طلب متزايد، وإعداد إصدارات الكيان أيضًا الحقل delete_time في حالة طلب حذف. تنسيق هذا قيمة كـ yyyy-mm-ddTHH:mm:ssZ

على سبيل المثال، لديك مشروع يتضمَّن رقم التعريف "delivery-provider-id" التي تستخدم مخطط مستودع الإصدار 2. تريد إجراء تغييرات على المطعم من خلال نوع الكيان الخاص بالمطعم وهو "قائمة طعام" ومعرف كيان لـ " menu Section_122 ". ستكون نقطة النهاية لتحديثات بياناتك هي ما يلي:

https://actions.googleapis.com/v2/apps/delivery-provider-id/entities/MenuSection/menuSection_122:push

لإزالة هذا العنصر نفسه، يمكنك إجراء طلب بيانات من واجهة برمجة التطبيقات HTTP DELETE هذا:

https://actions.googleapis.com/v2/apps/delivery-provider-id/entities/MenuSection/menuSection_122?entity.vertical=FOODORDERING

طلبات وضع الحماية

بالنسبة إلى طلبات وضع الحماية، يُرجى اتّباع الإرشادات الواردة في نقطة النهاية أعلاه، ولكن إرسال طلبات إلى /v2/sandbox/apps/ بدلاً من /v2/apps/. على سبيل المثال، تتم تنظيم طلب الحذف في وضع الحماية لمخطط مستودع الإصدار 2 على النحو التالي:

https://actions.googleapis.com/v2/sandbox/apps/PROJECT_ID/entities/TYPE/ENTITY_ID?entity.vertical=FOODORDERING&delete_time=DELETE_TIME

آخر الأخبار والإضافات

يجب أن تحتوي الخلاصات المجمعة اليومية أيضًا على أي تغييرات يتم إرسالها من خلال هذا واجهة برمجة التطبيقات. وبخلاف ذلك، ستحلّ التعديلات المجمّعة محلّ التغييرات التزايدية.

الحمولة

يجب أن يتضمن كل طلب POST معلمات الطلب إلى جانب JSON حمولة البيانات التي تتضمن البيانات المنظَّمة لأي نوع من أنواع الكيانات المدرَجة في مخطط المستودع.

يجب أن يظهر ملف JSON تمامًا كما يظهر في الخلاصة المجمّعة، حيث الاختلافات التالية:

  • يجب ألا يتجاوز حجم نص الحمولة 5 ميغابايت. على غرار الإجراء المجمّع الخلاصات، نقترح إزالة المسافات البيضاء لاستيعاب المزيد من البيانات.
  • في ما يلي الغلاف:
{
  "entity": {
    "data":"ENTITY_DATA",
    "vertical":"FOODORDERING"
  },
  "update_time":"UPDATE_TIMESTAMP"
}

في الحمولة أعلاه، استبدِل ما يلي:

  • ENTITY_DATA: تم تصنيف الكيان بتنسيق JSON بشكل تسلسلي كسلسلة. تشير رسالة الأشكال البيانية يجب ضبط كيان JSON-LD كسلسلة في الحقل data.
  • UPDATE_TIMESTAMP (اختياري): الطابع الزمني الذي تم فيه تعديل العنصر في أنظمتك. يجب ألا تكون قيمة الوقت في المستقبل. الطابع الزمني التلقائي هو الوقت تتلقى Google الطلب. عند إرسال كيان من خلال برنامج المستخدم، فإن إعداد إصدارات الكيان يستخدم أيضًا update_time في حالة طلب إضافة/تحديث.

تحديث كيان

المثال 1: تعديل معلومات مطعم

لنفترض أنك بحاجة بشكل عاجل إلى تحديث رقم هاتف مطعم. يحتوي التحديث على ملف JSON للمطعم بأكمله.

فكّر في خلاصة مجمّعة تشبه ما يلي:

{
  "@type": "Restaurant",
  "@id": "restaurant12345",
  "name": "Some Restaurant",
  "url": "https://www.provider.com/somerestaurant",
  "telephone": "+16501234567",
  "streetAddress": "345 Spear St",
  "addressLocality": "San Francisco",
  "addressRegion": "CA",
  "postalCode": "94105",
  "addressCountry": "US",
  "latitude": 37.472842,
  "longitude": -122.217144
}

سيكون التعديل التزايدي باستخدام HTTP POST على النحو التالي:

POST v2/apps/provider-project/entities/Restaurant/restaurant12345:push
Host: actions.googleapis.com
Content-Type: application/ld+json
{
  "entity": {
    "data": {
      "@type": "Restaurant",
      "@id": "restaurant12345",
      "name": "Some Restaurant",
      "url": "https://www.provider.com/somerestaurant",
      "telephone": "+16501235555",
      "streetAddress": "345 Spear St",
      "addressLocality": "San Francisco",
      "addressRegion": "CA",
      "postalCode": "94105",
      "addressCountry": "US",
      "latitude": 37.472842,
      "longitude": -122.217144
    },
    "vertical": "FOODORDERING"
  }
}

المثال 2: تعديل سعر صنف في القائمة

لنفترض أنك بحاجة إلى تغيير سعر صنف في قائمة. كما في المثال 1، تحديث يجب أن يحتوي على JSON للكيان ذي المستوى الأعلى بالكامل (القائمة)، تستخدم مخطط المستودع v1.

فكّر في خلاصة مجمّعة تشبه ما يلي:

{
  "@type": "MenuItemOffer",
  "@id": "menuitemoffer6680262",
  "sku": "offer-cola",
  "menuItemId": "menuitem896532",
  "price": 3.00,
  "priceCurrency": "USD"
}

بعد ذلك، سيكون التحديث التدريجي عبر POST على النحو التالي:

POST v2/apps/provider-project/entities/MenuItemOffer/menuitemoffer6680262:push
Host: actions.googleapis.com
Content-Type: application/ld+json
{
  "entity": {
    "data": {
      "@type": "MenuItemOffer",
      "@id": "menuitemoffer6680262",
      "sku": "offer-cola",
      "menuItemId": "menuitem896532",
      "price": 1.00,
      "priceCurrency": "USD"
    },
    "vertical": "FOODORDERING"
  }
}

إضافة كيان

لإضافة كيانات، تجنَّب استخدام تعديلات المستودع. بدلاً من ذلك، استخدِم الخلاصات المجمّعة. كما هو موضَّح في مخطط المستودع المستنِد إلى الإصدار 2.

إزالة كيان

لإزالة الكيانات ذات المستوى الأعلى، يمكنك استخدام نقطة نهاية معدّلة قليلاً، واستخدام HTTP DELETE بدلاً من HTTP POST في الطلب.

لا تستخدم HTTP DELETE لإزالة عنصر فرعي ضمن كيان ذي مستوى أعلى، مثل عنصر قائمة داخل قائمة. بدلاً من ذلك، تعامَل مع إزالة العناصر الفرعية على أنها تحديث لكيان مستوى أعلى يتم فيه إزالة الكيان الفرعي من قائمة أو معلمة ذات صلة.

المثال 1: حذف كيان من المستوى الأعلى

ضع في اعتبارك موقف تريد فيه حذف مطعم في خلاصة تستخدم مخطط مستودع الإصدار 1. ويجب أيضًا حذف خدماته وقوائمه.

نموذج نقطة نهاية لعنصر قائمة باستخدام رقم التعريف "https://www.provider.com/restaurant/menu/nr":

DELETE v2/apps/delivery-provider-id/entities/https%3A%2F%2Fwww.provider.com%2Frestaurant%2Fmenu%2Fnr?entity.vertical=FOODORDERING
Host: actions.googleapis.com

نموذج نقطة نهاية لكيان مطعم برقم التعريف "https://www.provider.com/restaurant/nr":

DELETE v2/apps/delivery-provider-id/entities/https%3A%2F%2Fwww.provider.com%2Frestaurant%2Fnr?entity.vertical=FOODORDERING
Host: actions.googleapis.com

نموذج نقطة نهاية لكيان خدمة باستخدام رقم التعريف "https://www.provider.com/restaurant/service/nr":

DELETE v2/apps/delivery-provider-id/entities/https%3A%2F%2Fwww.provider.com%2Frestaurant%2Fservice%2Fnr?entity.vertical=FOODORDERING
Host: actions.googleapis.com
}

المثال 2: إزالة العناصر الفرعية

لإزالة كيان فرعي من داخل كيان ذي مستوى أعلى، يجب إرسال العنصر ذي المستوى الأعلى مع إزالة الكيان الفرعي من الحقل المقابل. ما يلي: أن الخلاصة تستخدم مخطط مستودع الإصدار 1.

على سبيل المثال، لإزالة منطقة نطاق الخدمة، عدِّل الخدمة لتتضمّن منطقة نطاق الخدمة. تمت إزالته من قائمة areaServed.

POST v2/apps/delivery-provider-id/entities/https%3A%2F%2Fwww.provider.com%2Frestaurant%2Fservice%2Fnr:push
Host: actions.googleapis.com
Content-Type: application/ld+json
{
  "entity": {
    // Note: "data" is not serialized as a string in our example for readability.
    "data": {
      "@type": "Service",
      "provider": {
        "@type": "Restaurant",
        "@id": "https://www.provider.com/restaurant/nr"
      },
      "areaServed": [
        {
          "@type": "GeoCircle",
          "geoMidpoint": {
            "@type": "GeoCoordinates",
            "latitude": "42.362757",
            "longitude": "-71.087109"
          },
          "geoRadius": "10000"
        }
        // area2 is removed.
      ]
      ...
    },
    "vertical": "FOODORDERING"
  }
}

رموز الاستجابة من واجهة برمجة التطبيقات

ولا يعني نجاح الاستدعاء أن الخلاصة صالحة أو صحيحة، بل أن تم إجراء طلب بيانات من واجهة برمجة التطبيقات. تتلقى الاستدعاءات الناجحة رمز استجابة HTTP 200، إلى جانب مع نص استجابة فارغ:

{}

بالنسبة إلى الإخفاقات، لن يكون رمز استجابة HTTP هو 200، ولن يكون نص الاستجابة تشير إلى الخطأ الذي حدث.

على سبيل المثال، إذا حدَّد المستخدم عمود "vertical" (رأسي) القيمة الموجودة في المغلف FAKE_VERTICAL، ستتلقى الرسالة أدناه:

{
  "error": {
    "code": 400,
    "message": "Invalid value at 'entity.vertical' (TYPE_ENUM), \"FAKE_VERTICAL\"",
    "status": "INVALID_ARGUMENT",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.BadRequest",
        "fieldViolations": [
          {
            "field": "entity.vertical",
            "description": "Invalid value at 'entity.vertical' (TYPE_ENUM), \"FAKE_VERTICAL\""
          }
        ]
      }
    ]
  }
}

عيّنة تعليمات برمجية

وفي ما يلي بعض النماذج عن كيفية استخدام واجهة برمجة تطبيقات التحديثات الإضافية في اللغات. تستخدم هذه النماذج مكتبات مصادقة Google، وتفترض خلاصة باستخدام مخطط مستودع الإصدار 1. للحصول على حلول بديلة، يمكنك الرجوع إلى استخدام OAuth 2.0 لتطبيقات خادم إلى خادم:

تعديل الكيانات

Node.js

يستخدم هذا الرمز مكتبة المصادقة من Google لنظام Node.js.

const {auth} = require('google-auth-library')
const request = require('request');
// The service account client secret file downloaded from the Google Cloud Console
const serviceAccountJson = require('./service-account.json')
// entity.json is a file that contains the entity data in json format
const entity = require('./entity.json')

const ENTITY_ID = 'restaurant/http://www.provider.com/somerestaurant'
const PROJECT_ID = 'your-project-id'

/**
 * Get the authorization token using a service account.
 */
async function getAuthToken() {
  let client = auth.fromJSON(serviceAccountJson)
  client.scopes = ['https://www.googleapis.com/auth/assistant']
  const tokens = await client.authorize()
  return tokens.access_token;
}

/**
 * Send an incremental update to update or add an entity
 */
async function updateEntity(entityId, entity) {
  const token = await getAuthToken()
  request.post({
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${token}`
    },
    url: `https://actions.googleapis.com/v2/apps/${PROJECT_ID}/entities/${encodeURIComponent(entityId)}:push`,
    body: {
      entity: {
        data: JSON.stringify(entity),
        vertical: 'FOODORDERING',
      }
    },
    json: true
  },
  (err, res, body) => {
    if (err) { return console.log(err); }
    console.log(`Response: ${JSON.stringify(res)}`)
  })
}

updateEntity(ENTITY_ID, entity)

Python

يستخدم هذا الرمز مكتبة المصادقة من Google للغة Python.

from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSession
import json
import urllib

PROJECT_ID = 'your-project-id'
ENTITY_ID = 'restaurant/http://www.provider.com/somerestaurant'
ENDPOINT = 'https://actions.googleapis.com/v2/apps/%s/entities/%s:push' % (
    PROJECT_ID, urllib.quote(ENTITY_ID, ''))

# service-account.json is the service account client secret file downloaded from the
# Google Cloud Console
credentials = service_account.Credentials.from_service_account_file(
    'service-account.json')

scoped_credentials = credentials.with_scopes(
    ['https://www.googleapis.com/auth/assistant'])

authed_session = AuthorizedSession(scoped_credentials)

# Retrieving the entity
update_file = open("entity.json")  #JSON file containing entity data in json format.
data = update_file.read()

# Populating the entity with wrapper
entity = {}
entity['data'] = data #entity JSON-LD serialized as string
entity['vertical'] = 'FOODORDERING'

request = {}
request['entity'] = entity

response = authed_session.post(ENDPOINT, json=request)

print(response.text) #if successful, will be '{}'

Java

يستخدم هذا الرمز مكتبة مصادقة Google للغة Java.

private static final String PROJECT_ID = "your-project-id";
private static final String ENTITY_ID = "http://www.provider.com/somerestaurant";

/**
 * Get the authorization token using a service account.
 */
private static String getAuthToken() {
  InputStream serviceAccountFile =
      Example.class.getClassLoader().getResourceAsStream("service-account.json");
  ServiceAccountCredentials.Builder credentialsSimpleBuilder =
      ServiceAccountCredentials.fromStream(serviceAccountFile).toBuilder();
  credentialsSimpleBuilder.setScopes(ImmutableList.of("https://www.googleapis.com/auth/assistant"));
  AccessToken accessToken = credentialsSimpleBuilder.build().refreshAccessToken();
  return accessToken.getTokenValue();
}

/**
 * Send an incremental update to update or add an entity.
 * @param entityId The id of the entity to update.
 * @param entity the json of the entity to be updated.
 */
public void updateEntity(String entityId, JSONObject entity) {
  String authToken = getAuthToken();
  String endpoint = String.format(
      "https://actions.googleapis.com/v2/apps/%s/entities/%s:push",
      PROJECT_ID, URLEncoder.encode(entityId, "UTF-8"));
  JSONObject data = new JSONObject();
  data.put("data", entity.toString());
  data.put("vertical", "FOODORDERING");
  JSONObject jsonBody = new JSONObject();
  jsonBody.put("entity", data);
  // Execute POST request
  executePostRequest(endpoint, authToken, jsonBody);
}

إزالة الكيانات

Node.js

يستخدم هذا الرمز مكتبة المصادقة من Google لنظام Node.js.

const {auth} = require('google-auth-library')
const request = require('request');
// The service account client secret file downloaded from the Google Cloud Console
const serviceAccountJson = require('./service-account.json')
// entity.json is a file that contains the entity data in json format
const entity = require('./entity.json')

const ENTITY_ID = 'restaurant/http://www.provider.com/somerestaurant'
const PROJECT_ID = 'your-project-id'

/**
 * Get the authorization token using a service account.
 */
async function getAuthToken() {
  let client = auth.fromJSON(serviceAccountJson)
  client.scopes = ['https://www.googleapis.com/auth/assistant']
  const tokens = await client.authorize()
  return tokens.access_token;
}

/**
 * Send an incremental update to delete an entity
 */
async function deleteEntity(entityId) {
  const token = await getAuthToken()
  request.delete({
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${token}`
    },
    url: `https://actions.googleapis.com/v2/apps/${PROJECT_ID}/entities/${encodeURIComponent(entityId)}?entity.vertical=FOODORDERING`,
    body: {},
    json: true
  },
  (err, res, body) => {
    if (err) { return console.log(err); }
    console.log(`Response: ${JSON.stringify(res)}`)
  })
}

deleteEntity(ENTITY_ID)

Python

يستخدم هذا الرمز مكتبة المصادقة من Google للغة Python.

from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSession
import json
import urllib

# Service config
PROJECT_ID = 'your-project-id'
ENTITY_ID = 'restaurant/http://www.provider.com/somerestaurant'
DELETE_TIME = '2018-04-07T14:30:00-07:00'
ENDPOINT = 'https://actions.googleapis.com/v2/apps/%s/entities/%s?entity.vertical=FOODORDERING&delete_time=%s' % (
    PROJECT_ID, urllib.quote(ENTITY_ID, ''), urllib.quote(DELETE_TIME, ''))

# service-account.json is the service account client secret file downloaded from the
# Google Cloud Console
credentials = service_account.Credentials.from_service_account_file(
    'service-account.json')

scoped_credentials = credentials.with_scopes(
    ['https://www.googleapis.com/auth/assistant'])

authed_session = AuthorizedSession(scoped_credentials)
response = authed_session.delete(ENDPOINT)

print(response.text) #if successful, will be '{}'

Java

يستخدم هذا الرمز مكتبة مصادقة Google للغة Java.

private static final String PROJECT_ID = "your-project-id";
private static final String ENTITY_ID = "restaurant/http://www.provider.com/somerestaurant";

/**
 * Get the authorization token using a service account.
 */
private static String getAuthToken() {
  InputStream serviceAccountFile = Example.class.getClassLoader().getResourceAsStream("service-account.json");
  ServiceAccountCredentials.Builder credentialsSimpleBuilder =
      ServiceAccountCredentials.fromStream(serviceAccountFile).toBuilder();
  credentialsSimpleBuilder.setScopes(ImmutableList.of("https://www.googleapis.com/auth/assistant"));
  AccessToken accessToken = credentialsSimpleBuilder.build().refreshAccessToken();
  return accessToken.getTokenValue();
}

/**
 * Send an incremental update to delete an entity.
 * @param entityId The id of the entity to delete.
 */
public void deleteEntity(String entityId) {
  String authToken = getAuthToken();
  String endpoint = String.format(
      "https://actions.googleapis.com/v2/apps/%s/entities/%s?entity.vertical=FOODORDERING",
      PROJECT_ID, URLEncoder.encode(entityId, "UTF-8"));
  // Execute DELETE request
  System.out.println(executeDeleteRequest(endpoint, authToken));
}

حالات الاستخدام

تشمل حالات الاستخدام التالية أمثلة على التعديلات التزايدية وتعديلات الخلاصات الكاملة والمحتوى على مستوى عالٍ في طلب البيانات من واجهة برمجة التطبيقات:

السيناريو كيان من المستوى الأعلى الوصف والتأثيرات
إيقاف خدمة DisabledService

تحتاج إلى إيقاف خدمة لسبب غير متوقع.

تحديثات إضافية: أرسِل الكيان Service في تم تغيير السؤال مع @type إلى DisabledService، مع الإبقاء على السمات الأخرى كما هي.

الخلاصات الكاملة: احرص على تعديل العنصر من الخلاصات الكاملة. أن يتم ضبط @type على DisabledService قبل عملية الجلب التالية من Google، وإلا ستتم إعادة تفعيل الكيان.

سلعة معيّنة غير متوفّرة Menu تحديثات إضافية: أرسِل Menu المغلف. كيان مع ضبط offer.inventoryLevel على 0 MenuItem وجميع البيانات الأخرى بدون تغيير.
تغيير سعر الصنف في القائمة Menu تحديثات إضافية: أرسِل Menu المغلف. كيان offer.price تم ضبط السعر المعدَّل له MenuItem وجميع البيانات الأخرى بدون تغيير.

إضافة كيان جديد ذي مستوى أعلى

ينطبق فقط على الكيان من الأنواع Menu، Restaurant وService

Menu وRestaurant وService

على سبيل المثال، تحتاج إلى إضافة قائمة طعام جديدة إلى مطعم.

تعديلات تدريجية: أرسِل الكيان الجديد لقائمة الطعام مع المطعم. يتم تحديث الكيان بالحقل hasMenu وفقًا لذلك.

حذف الكيان ذي المستوى الأعلى نهائيًا

ينطبق فقط على الكيان من الأنواع Menu، Restaurant وService

Menu وRestaurant وService

تحديثات إضافية: أرسِل الحذف الفاضح

الخلاصات الكاملة: احرص على إزالة الكيان من الخلاصات الكاملة قبل عملية الجلب التالية من Google، وإلا ستتم إعادة إضافة الكيان.

إضافة منطقة توصيل جديدة في Service محدّد Service الخلاصات التزايدية: أرسِل الكيان Service المعني مع كل الحقول سليمة، كما هو الحال عادةً ضمن الخلاصات الكاملة، مع تضمين منطقة تسليم جديدة المحدد في areaServed من Service.
تعديل الوقت المقدّر للوصول في Service Service الخلاصات التدريجية: أرسِل Service القيمة نفسها كما في الخلاصات، إلا أنّه تم تعديل hoursAvailable.deliveryHours فيها وفقًا لذلك.
تعديل أسعار التوصيل في Service Service الخلاصات التدريجية: إرسال Service كاملة باستخدام تم تعديل offers.priceSpecification.price.
تعديل ساعات عمل خدمة التوصيل أو طلب الوجبات الجاهزة لتناولها خارج المطعم في Service Service الخلاصات التدريجية: أرسِل Service القيمة نفسها كما في الخلاصات، إلا أنّه تم تعديل hoursAvailable فيها وفقًا لذلك.
Service (تغيير الحد الأدنى لمبلغ الطلب) Service الخلاصات التدريجية: إرسال Service كاملة باستخدام Service.offers.priceSpecification.eligibleTransactionVolume تم التحديث
حذف MenuItem نهائيًا Menu الخلاصات التدريجية: أرسِل Menu القيمة نفسها الواردة في ولكن مع إزالة MenuItem من قائمة hasMenuItems

هدف مستوى الخدمة المتعلّق بوقت المعالجة للمهام المجمّعة والتحديثات المتزايدة

إنّ العنصر الذي تمت إضافته من خلال تحديث مجمّع أو تزايدي ستتم معالجته في من يوم إلى يومين. إنّ كيان تم تعديله أو حذفه من خلال دفعة ستتم معالجته في غضون ساعة، بينما ستتم معالجة كيان تم تحديثه من خلال تحديث تزايدي خلال 5 دقائق. يتم حذف الكيان القديم بعد 7 أيام.

يمكنك إرسال ما يلي إلى Google:

  • مهام متعددة دُفعة واحدة في اليوم لإبقاء مستودعك محدّثًا
  • مهمة مجمّعة واحدة يوميًا وواجهات برمجة تطبيقات إضافية لإبقاء مستودعك محدّثًا