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

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

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

المتطلبات الأساسية

يجب توفير العناصر التالية قبل تنفيذ التحديثات التزايدية:

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

نقاط النهاية

في الطلبات التالية، استبدل ما يلي:

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

تعديل نقطة النهاية

لتعديل كيان، يمكنك تقديم طلب HTTP POST إلى نقطة النهاية التالية وتضمين حمولة التحديثات والإضافات. يمكنك إجراء تعديلات على ما يصل إلى 1,000 كيان في طلب بيانات واحد من واجهة برمجة التطبيقات.

https://actions.googleapis.com/v2/apps/PROJECT_ID/entities:batchPush

على سبيل المثال، إذا كنت تريد تحديث الكيانات في مشروع باستخدام المعرّف "delivery-provider-id"، ستكون نقطة النهاية على النحو التالي:

https://actions.googleapis.com/v2/apps/delivery-provider-id/entities:batchpush

حذف نقطة النهاية

لحذف كيان في المستودع، يمكنك تقديم طلب HTTP DELETE إلى نقطة النهاية التالية.

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

على سبيل المثال، لحذف كيان "قائمة القسمة" الذي يحمل المعرّف "menusection_122" من المشروع "delivery-provider-id"، يمكنك إجراء استدعاء HTTP DELETE API إلى:

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

بيئة وضع الحماية

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

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

تعديل العناصر

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

تعديل الحمولة

من المفترض أن يظهر ملف JSON نفسه كما يظهر في الخلاصة المجمّعة، مع الاختلافات التالية:

  • يجب ألا يتجاوز حجم نص الحمولة 5 ميغابايت. على غرار الخلاصات المجمّعة، نقترح إزالة المسافات البيضاء لملاءمة المزيد من البيانات.
  • يكون الغلاف على النحو التالي:
{
  "requests": [
    {
      "entity": {
        "data":"ENTITY_DATA",
        "name": "apps/project_id>/entities/type/entity_id"
      },
      "update_time":"UPDATE_TIMESTAMP"
    },
  ],
  "vertical": "FOODORDERING"
}

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

  • 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/sandbox/apps/provider-project/entities:batchPush
Host: actions.googleapis.com
Content-Type: application/ld+json
{
  "requests": [
    {
      "entity": {
        "name": "apps/provider-project/entities/restaurant/restaurant12345",
        "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: تحديث مطاعم متعددة

لتعديل كيانَين للمطعم في استدعاء واحد من واجهة برمجة التطبيقات، سيكون طلب HTTP POST على النحو التالي:

POST v2/sandbox/apps/provider-project/entities:batchPush
Host: actions.googleapis.com
Content-Type: application/ld+json
{
  "requests": [
    {
      "entity": {
        "name": "apps/provider-project/entities/restaurant/restaurant12345",
        "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
        }
      }
    },
    {
      "entity": {
        "name": "apps/provider-project/entities/restaurant/restaurant123",
        "data": {
          "@type": "Restaurant",
          "@id": "restaurant123",
          "name": "Some Other Restaurant",
          "url": "https://www.provider.com/somerestaurant",
          "telephone": "+16501231235",
          "streetAddress": "385 Spear St",
          "addressLocality": "San Mateo",
          "addressRegion": "CA",
          "postalCode": "94115",
          "addressCountry": "US"
        }
      }
    }
  ]
  "vertical": "FOODORDERING"
}

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

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

يمكنك إنشاء خلاصة مجمَّعة على النحو التالي:

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

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

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

إضافة كيان

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

إزالة كيان

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

حذف كيان عالي المستوى

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

نموذج نقطة نهاية لكيان قائمة يحمل المعرّف "provider/مطعم/menu/nr":

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

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

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

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

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

إزالة الكيانات الفرعية

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

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

ولا يعني الاستدعاء الناجح أن الخلاصة صالحة أو صحيحة، بل يعني فقط أنّه تم إجراء طلب بيانات من واجهة برمجة التطبيقات. تتلقى الاستدعاءات الناجحة رمز استجابة 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 وتفترض خلاصة باستخدام مخطط مستودع الإصدار الأول. للتعرّف على الحلول البديلة، يُرجى الاطّلاع على استخدام 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 = 'your/entity/id'
const PROJECT_ID = 'type/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(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:batchPush`,
    body: {
      requests: [
        {
          entity: {
            data: JSON.stringify(entity)
            name: `apps/${PROJECT_ID}/entities/${ENTITY_ID}`
          }
        }
      ],
      vertical: 'FOODORDERING'
    },
    json: true
  },
  (err, res, body) => {
    if (err) { return console.log(err); }
    console.log(`Response: ${JSON.stringify(res)}`)
  })
}

updateEntity(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 = 'type/your/entity/id'

ENDPOINT = 'https://actions.googleapis.com/v2/apps/%s/entities:batchPush' % (
    PROJECT_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()

entity = {}
entity['data'] = data #entity JSON-LD serialized as string
entity['name'] = 'apps/%s/entities/%s' % (PROJECT_ID, urllib.quote(ENTITY_ID, '') )

# Populating the request
request = {}
request['entity'] = entity
requestArray = [request]

# Populating the payload
payload = {}
payload['requests'] = requestArray
payload['vertical'] = 'FOODORDERING'

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

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 = "type/your-entity-id";

/**
 * 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 data) {
  String authToken = getAuthToken();
  String endpoint = String.format("https://actions.googleapis.com/v2/apps/%s/entities/:batchPush", PROJECT_ID);

  JSONObject entity = new JSONObject();
  entity.put("data", data.toString());
  entity.put("name", String.format("apps/%s/entities/%s", PROJECT_ID, URLEncoder.encode(ENTITY_ID, "UTF-8")));

  JSONObject request = new JSONObject();
  request.put("entity", entity);

  JSONArray requestArray = new JSONArray();
  requestArray.put(request);

  JSONObject payload = new JSONObject();
  payload.put("requests", requestArray);
  payload.put("vertical", FOODORDERING);

  // Execute POST request
  executePostRequest(endpoint, authToken, payload);
}

إزالة العناصر

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));
}

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

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

السيناريو العنصر المطلوب تعديله الوصف والتأثيرات
إيقاف خدمة Service

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

التعديلات التدريجية: يمكنك تعديل الكيان Service المعنيّ من خلال ضبط السمة isDisabled على true، مع الإبقاء على الخصائص الأخرى نفسها.

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

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

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

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

Menu وRestaurant وService

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

الخلاصات الكاملة: أضِف العنصر في خلاصات البيانات وانتظِر حتى يتم نقل البيانات بشكل مجمّع.

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

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

Menu وRestaurant وService

التعديلات التدريجية: أرسِل حذفًا صريحًا.

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

إضافة منطقة تسليم جديدة في Service محدّد ServiceArea الخلاصات التدريجية: أرسِل الكيان ServiceArea المعني مع الاحتفاظ بجميع حقوله بدون تغيير، كما تفعل عادةً ضمن الخلاصات الكاملة، مع تحديد منطقة التسليم الجديدة ضمن polygon أو geoRadius أو postalCode.
تعديل الوقت المقدّر للوصول في Service ServiceHours الخلاصات التزايدية: أرسِل السمة ServiceHours تمامًا كما في الخلاصات، باستثناء السمة leadTimeMin التي يتم تعديلها وفقًا لذلك.
تعديل أسعار التوصيل في Service Fee الخلاصات التزايدية: أرسِل قيمة التسليم الكاملة Fee مع تعديل السمة price.
تعديل ساعات عمل خدمة التوصيل أو طلب الوجبات الجاهزة لتناولها خارج المطعم في Service ServiceHours الخلاصات التدريجية: أرسِل السمة ServiceHours كما هي الحال في الخلاصات، باستثناء أنّ السمتَين opens وcloses يتم تعديلهما وفقًا لذلك.
Service (تغيير الحدّ الأدنى لمبلغ الطلب) Fee الخلاصات التزايدية: إرسال Fee كاملة مع minPrice المعدَّلة
حذف MenuItem نهائيًا Menu الخلاصات المتزايدة: أرسِل السمة MenuItem تمامًا كما في الخلاصات، ولكن مع ترك السمة parentMenuSectionId فارغة.

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

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

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

  • إجراء مهام مجمَّعة متعددة في اليوم لإبقاء المستودع محدّثًا، أو
  • مهمة مجمَّعة واحدة في اليوم وواجهات برمجة التطبيقات المتزايدة للحفاظ على تحديث مستودعك الإعلاني