به روز رسانی در زمان واقعی

این بخش توضیح می‌دهد که چگونه می‌توانید به‌روزرسانی‌های حساس به زمان موجودی‌های موجودی خود را به Google ارسال کنید. API به‌روزرسانی‌های بی‌درنگ به شما امکان می‌دهد به‌روزرسانی‌ها را فشار دهید و موجودی‌های Sandbox یا موجودی Production خود را تقریباً در زمان واقعی حذف کنید.

این عملکرد عمدتاً برای به‌روزرسانی‌هایی است که نمی‌توانید پیش‌بینی کنید، مانند بسته شدن اضطراری، حذف موارد از منو یا به‌روزرسانی قیمت یک آیتم منو، که باید به سرعت در رابط کاربری Google منعکس شود. اگر نیازی نیست تغییر شما فوراً منعکس شود، می‌توانید به جای آن از بلع دسته‌ای استفاده کنید. به روز رسانی های زمان واقعی در بیش از پنج دقیقه پردازش نمی شوند.

پیش نیازها

قبل از اجرای به‌روزرسانی‌های بی‌درنگ، موارد زیر لازم است:

  1. Maps Booking API فعال است:
    • در GCP به APIs & Services > Library بروید
    • جستجوی «Google Maps Booking API»
      API های رزرو Google Maps را پیدا کنید
    • نمونه Sandbox ("Google Maps Booking API (Dev)") را پیدا کنید و روی فعال کردن کلیک کنید
    • نمونه تولید ("Google Maps Booking API") را پیدا کنید و روی فعال کردن کلیک کنید
      Google Maps Booking API را فعال کنید
  2. یک حساب سرویس با نقش ویرایشگر پروژه GCP شما ایجاد می شود. برای جزئیات بیشتر، تنظیمات حساب را ببینید.
  3. فیدهای داده تولید یا جعبه ایمنی میزبانی و دریافت می‌شوند. برای جزئیات بیشتر، مصرف گروهی را ببینید.
  4. برای احراز هویت API توصیه می شود کتابخانه Google Client را به زبان مورد نظر خود نصب کنید. از «https://www.googleapis.com/auth/mapsbooking» به عنوان محدوده OAuth استفاده کنید. نمونه کدهای موجود در زیر از این کتابخانه ها استفاده می کنند. در غیر این صورت، باید مطابق با استفاده از OAuth 2.0 برای دسترسی به Google API، مبادلات رمز را به صورت دستی انجام دهید.

بررسی اجمالی

API به روز رسانی بلادرنگ از دو نوع عملیات پشتیبانی می کند. اولین عملیات upsert برای به روز رسانی موجودیت های موجود است. دومین عملیات حذف برای حذف موجودی ها از موجودی شما است. هر دو عملیات بر روی طیف وسیعی از موجودیت های فهرست شده در بدنه درخواست انجام می شود. می‌توانید تا 1000 موجودیت را در یک تماس API به‌روزرسانی کنید. API تمام درخواست های دریافتی را می پذیرد و آنها را برای پردازش بیشتر در یک صف قرار می دهد. بنابراین درخواست های RTU به صورت ناهمزمان پردازش می شوند.

API به روز رسانی بلادرنگ در دو محیط کار می کند: جعبه شنی و تولید. محیط Sandbox برای آزمایش درخواست‌های API و محیط تولید برای به‌روزرسانی محتوای قابل مشاهده برای سفارش کاربران End-to-End استفاده می‌شود. نام میزبان هر دو محیط:

  • Sandbox - partnerdev-mapsbooking.googleapis.com
  • تولید - mapsbooking.googleapis.com

نقاط پایانی

API به‌روزرسانی‌های بی‌درنگ دو نقطه پایانی را برای رسیدگی به درخواست‌های دریافتی برای به‌روزرسانی موجودی نشان می‌دهد:

  • UPSERT - /v1alpha/inventory/partners/ PARTNER_ID /feeds/owg.v2/record:batchPush
  • DELETE - /v1alpha/inventory/partners/ PARTNER_ID /feeds/owg.v2/record:batchDelete

پارامتر PARTNER_ID می‌توانید در «مرکز اقدامات» که به‌عنوان شناسه شریک در صفحه حساب و کاربران نمایش داده می‌شود، همانطور که در تصویر زیر نشان داده شده است، پیدا کنید.

شناسه شریک در پورتال شریک

با در نظر گرفتن 10000001 به عنوان مقدار PARTNER_ID به عنوان مثال از تصویر بالا، URL های کامل برای ارسال درخواست های API در جعبه ایمنی و تولید مانند نمونه های زیر خواهند بود.

# Sandbox UPSERT
https://partnerdev-mapsbooking.googleapis.com/v1alpha/inventory/partners/10000001/feeds/owg.v2/record:batchPush
# Sandbox DELETE
https://partnerdev-mapsbooking.googleapis.com/v1alpha/inventory/partners/10000001/feeds/owg.v2/record:batchDelete
# Production UPSERT
https://mapsbooking.googleapis.com/v1alpha/inventory/partners/10000001/feeds/owg.v2/record:batchPush
# Production DELETE
https://mapsbooking.googleapis.com/v1alpha/inventory/partners/10000001/feeds/owg.v2/record:batchDelete

به روز رسانی نهادها

برای به‌روزرسانی موجودی‌های موجود در فهرست خود، از نقطه پایانی UPSERT استفاده کنید و درخواست‌های HTTP POST را ارسال کنید. هر درخواست POST باید شامل پارامتر PARTNER_ID همراه با بار JSON باشد که حاوی داده‌های ساختاریافته از هر نوع موجودی است که در طرح موجودی فهرست شده است.

بارگذاری درخواست را بالا ببرید

بدنه درخواست یک شی JSON با لیستی از رکوردها است. هر رکورد مربوط به یک موجودیت در حال به روز رسانی است. این شامل فیلد data_record با بارگذاری موجودیت کدگذاری شده در Base64 و نشان‌دهنده generation_timestamp است که زمان به‌روزرسانی موجودیت را نشان می‌دهد:

  {
    "records": [
      {
        "data_record":"BASE_64_ENCODED_ENTITY",
        "generation_timestamp":"UPDATE_TIMESTAMP"
      }
    ]
  }

در محموله فوق، موارد زیر را جایگزین کنید:

  • BASE_64_ENCODED_ENTITY : رشته JSON کدگذاری شده توسط Base64 موجودیت. موجودیت رمزگشایی شده JSON باید ساختاری مشابه مشخصات فید داشته باشد، به عنوان مثال:

    {"@type":"MenuSection","name":"My Updated Menu Section","menuId":{"@id":"10824","displayOrder":1},"@id":"853705"}
  • UPDATE_TIMESTAMP : مطمئن شوید که مُهر زمانی مربوط به زمان ایجاد موجودیت را در سیستم‌های باطن خود لحاظ کنید. این مهر زمانی برای اطمینان از ترتیب صحیح به روز رسانی موجودی استفاده می شود. اگر این فیلد گنجانده نشود، روی زمانی تنظیم می‌شود که Google درخواست را دریافت می‌کند. هنگام به‌روزرسانی یک موجودیت از طریق درخواست batchPush ، از فیلد generation_timestamp برای نسخه‌سازی موجودیت استفاده می‌شود. قالب مورد انتظار مقادیر زمانی را در طرح موجودی رابطه ای مشاهده کنید.

هر درخواست به روز رسانی بلادرنگ باید این شرایط را داشته باشد:

  • حجم بدنه محموله نباید بیش از 5 مگابایت باشد. به طور مشابه به فیدهای دسته ای، ما به شما پیشنهاد می کنیم که فضاهای خالی را به منظور برازش داده های بیشتر حذف کنید.
  • می‌تواند تا 1000 موجودیت در یک درخواست batchPush وجود داشته باشد.

مثال ها

مثال 1: به روز رسانی یک رستوران

فرض کنید نیاز فوری دارید شماره تلفن یک رستوران را به روز کنید. به‌روزرسانی شما حاوی JSON برای کل رستوران است.

یک فید دسته ای را در نظر بگیرید که به شکل زیر است:

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

سپس به روز رسانی بلادرنگ شما توسط HTTP POST به صورت زیر خواهد بود:

JSON

POST v1alpha/inventory/partners/PARTNER_ID/feeds/owg.v2/record:batchPush
Host: mapsbooking.googleapis.com
Content-Type: application/json
{
  "records": [
    {
      "data_record": {
        "@type": "Restaurant",
        "@id": "restaurant12345",
        "name": "Some Restaurant",
        "url": "https://www.provider.com/somerestaurant",
        "telephone": "+16501234570",
        "streetAddress": "345 Spear St",
        "addressLocality": "San Francisco",
        "addressRegion": "CA",
        "postalCode": "94105",
        "addressCountry": "US",
        "latitude": 37.472842,
        "longitude": -122.217144
      }
      "generation_timestamp": "2022-08-19T17:11:10.750Z"
    }
  ]
}
    

پایه 64

مثال مشابه با یک بار رمزگذاری شده Base64.

POST v1alpha/inventory/partners/PARTNER_ID/feeds/owg.v2/record:batchPush
Host: mapsbooking.googleapis.com
Content-Type: application/json
{
  "records": [
    {
      "data_record": "eyJAdHlwZSI6IlJlc3RhdXJhbnQiLCJAaWQiOiJyZXN0YXVyYW50MTIzNDUiLCJuYW1lIjoiU29tZSBSZXN0YXVyYW50IiwidXJsIjoiaHR0cHM6Ly93d3cucHJvdmlkZXIuY29tL3NvbWVyZXN0YXVyYW50IiwidGVsZXBob25lIjoiKzE2NTAxMjM0NTcwIiwic3RyZWV0QWRkcmVzcyI6IjM0NSBTcGVhciBTdCIsImFkZHJlc3NMb2NhbGl0eSI6IlNhbiBGcmFuY2lzY28iLCJhZGRyZXNzUmVnaW9uIjoiQ0EiLCJwb3N0YWxDb2RlIjoiOTQxMDUiLCJhZGRyZXNzQ291bnRyeSI6IlVTIiwibGF0aXR1ZGUiOjM3LjQ3Mjg0MiwibG9uZ2l0dWRlIjotMTIyLjIxNzE0NH0="
      "generation_timestamp": "2022-08-19T17:11:10.750Z"
    }
  ]
}
    

مثال 2: به روز رسانی چندین رستوران

برای به‌روزرسانی دو نهاد رستوران در یک تماس API، درخواست HTTP POST به صورت زیر است:

JSON

POST v1alpha/inventory/partners/PARTNER_ID/feeds/owg.v2/record:batchPush
Host: mapsbooking.googleapis.com
Content-Type: application/json
{
  "records": [
    {
      "data_record": {
        "@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
      },
      "generation_timestamp": "2022-08-19T17:11:10.850Z"
    },
    {
      "data_record": {
        "@type": "Restaurant",
        "@id": "restaurant123",
        "name": "Some Other Restaurant",
        "url": "https://www.provider.com/someotherrestaurant",
        "telephone": "+16501231235",
        "streetAddress": "385 Spear St",
        "addressLocality": "San Mateo",
        "addressRegion": "CA",
        "postalCode": "94115",
        "addressCountry": "US"
      },
      "generation_timestamp": "2022-08-19T17:11:10.850Z"
    }
  ]
}
    

پایه 64

مثال مشابه با یک بار رمزگذاری شده Base64.

POST v1alpha/inventory/partners/PARTNER_ID/feeds/owg.v2/record:batchPush
Host: mapsbooking.googleapis.com
Content-Type: application/json
{
  "records": [
    {
      "data_record": "eyJAdHlwZSI6IlJlc3RhdXJhbnQiLCJAaWQiOiJyZXN0YXVyYW50MTIzNDUiLCJuYW1lIjoiU29tZSBSZXN0YXVyYW50IiwidXJsIjoiaHR0cHM6Ly93d3cucHJvdmlkZXIuY29tL3NvbWVyZXN0YXVyYW50IiwidGVsZXBob25lIjoiKzE2NTAxMjM1NTU1Iiwic3RyZWV0QWRkcmVzcyI6IjM0NSBTcGVhciBTdCIsImFkZHJlc3NMb2NhbGl0eSI6IlNhbiBGcmFuY2lzY28iLCJhZGRyZXNzUmVnaW9uIjoiQ0EiLCJwb3N0YWxDb2RlIjoiOTQxMDUiLCJhZGRyZXNzQ291bnRyeSI6IlVTIiwibGF0aXR1ZGUiOjM3LjQ3Mjg0MiwibG9uZ2l0dWRlIjotMTIyLjIxNzE0NH0=",
      "generation_timestamp": "2022-08-19T17:11:10.850Z"
    },
    {
      "data_record": "eyJAdHlwZSI6IlJlc3RhdXJhbnQiLCJAaWQiOiJyZXN0YXVyYW50MTIzIiwibmFtZSI6IlNvbWUgT3RoZXIgUmVzdGF1cmFudCIsInVybCI6Imh0dHBzOi8vd3d3LnByb3ZpZGVyLmNvbS9zb21lcmVzdGF1cmFudCIsInRlbGVwaG9uZSI6IisxNjUwMTIzMTIzNSIsInN0cmVldEFkZHJlc3MiOiIzODUgU3BlYXIgU3QiLCJhZGRyZXNzTG9jYWxpdHkiOiJTYW4gTWF0ZW8iLCJhZGRyZXNzUmVnaW9uIjoiQ0EiLCJwb3N0YWxDb2RlIjoiOTQxMTUiLCJhZGRyZXNzQ291bnRyeSI6IlVTIn0=",
      "generation_timestamp": "2022-08-19T17:11:10.850Z"
    }
  ]
}
    

مثال 3: به روز رسانی قیمت آیتم های منو

فرض کنید باید قیمت یک آیتم منو را تغییر دهید.

خوراک دسته‌ای را در نظر بگیرید که به شکل زیر است:

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

سپس به روز رسانی بلادرنگ شما از طریق POST به صورت زیر خواهد بود:

JSON

POST v1alpha/inventory/partners/PARTNER_ID/feeds/owg.v2/record:batchPush
Host: mapsbooking.googleapis.com
Content-Type: application/json
{
  "records": [
    {
      "data_record": {
        "@type": "MenuItemOffer",
        "@id": "menuitemoffer6680262",
        "sku": "offer-cola",
        "menuItemId": "menuitem896532",
        "price": 2,
        "priceCurrency": "USD"
      },
      "generation_timestamp": "2022-08-19T17:20:10Z"
    }
  ]
}
    

پایه 64

مثال مشابه با یک بار رمزگذاری شده Base64.

POST v1alpha/inventory/partners/PARTNER_ID/feeds/owg.v2/record:batchPush
Host: mapsbooking.googleapis.com
Content-Type: application/json
{
  "records": [
    {
      "data_record": "eyJAdHlwZSI6Ik1lbnVJdGVtT2ZmZXIiLCJAaWQiOiJtZW51aXRlbW9mZmVyNjY4MDI2MiIsInNrdSI6Im9mZmVyLWNvbGEiLCJtZW51SXRlbUlkIjoibWVudWl0ZW04OTY1MzIiLCJwcmljZSI6MiwicHJpY2VDdXJyZW5jeSI6IlVTRCJ9",
      "generation_timestamp": "2022-08-19T17:20:10Z"
    }
  ]
}

    

افزودن موجودیت ها

از به‌روزرسانی‌های بی‌درنگ برای افزودن موجودیت‌های جدید استفاده نکنید، زیرا ممکن است منجر به ناهماهنگی داده‌ها شود. در عوض، از فرآیند تغذیه دسته ای همانطور که برای بلع دسته ای توضیح داده شد استفاده کنید.

در حال حذف نهادها

برای حذف موجودی ها از موجودی خود، از نقطه پایانی DELETE استفاده کنید و درخواست های HTTP POST را ارسال کنید. هر درخواست POST باید شامل پارامتر PARTNER_ID به همراه محموله JSON حاوی شناسه هر موجودی در موجودی شما باشد.

حذف بار درخواستی

بدنه یک درخواست حذف ساختاری مشابه درخواست به‌روزرسانی دارد. همچنین فهرستی از رکوردها با فیلدهای data_record و delete_time دارد:

  {
    "records": [
      {
        "data_record":"BASE_64_ENCODED_REFERENCE",
        "delete_time": "DELETE_TIMESTAMP"
      }
    ]
  }

در محموله فوق، موارد زیر را جایگزین کنید:

  • BASE_64_ENCODED_REFERENCE : رشته JSON ارجاع به نهادی که در حال حذف است، کدگذاری شده توسط Base64. یک مرجع فقط از نوع موجودیت و شناسه تشکیل شده است، برای مثال یک نمایش JSON از یک مرجع به یک MenuSection :

    {"@type":"MenuSection","@id":"853705"}
  • DELETE_TIMESTAMP : مطمئن شوید که مُهر زمانی برای زمانی که نهاد در سیستم باطن شما حذف شده است را درج کنید. این مهر زمانی برای تعیین ترتیب اعمال حذف در موجودی استفاده می شود.

می تواند تا 1000 موجودیت در یک درخواست batchDelete وجود داشته باشد.

مثال ها

مثال 1: حذف دو نهاد MenuItem

برای حذف دو آیتم منو در یک تماس API، درخواست HTTP POST به صورت زیر خواهد بود:

JSON

POST v1alpha/inventory/partners/PARTNER_ID/feeds/owg.v2/record:batchDelete
Host: mapsbooking.googleapis.com
Content-Type: application/json
{
  "records": [
    {
      "data_record": {
        "@type": "MenuItem",
        "@id": "item_1234"
      },
      "delete_time": "2022-08-21T15:23:00.000Z"
    },
    {
      "data_record": {
        "@type": "MenuItem",
        "@id": "item_5678"
      },
      "delete_time": "2022-08-21T15:23:00.000Z"
    }
  ]
}
    

پایه 64

مثال مشابه با یک بار رمزگذاری شده Base64.

POST v1alpha/inventory/partners/PARTNER_ID/feeds/owg.v2/record:batchDelete
Host: mapsbooking.googleapis.com
Content-Type: application/json
{
  "records": [
    {
      "data_record": "eyJAdHlwZSI6Ik1lbnVJdGVtIiwiQGlkIjoiaXRlbV8xMjM0In0="
      "delete_time": "2022-08-21T15:23:00.000Z"
    },
    {
      "data_record": "eyJAdHlwZSI6Ik1lbnVJdGVtIiwiQGlkIjoiaXRlbV81Njc4In0="
      "delete_time": "2022-08-21T15:23:00.000Z"
    },
  ]
}
    

مثال 2: حذف یک موجودیت Restaurant

موقعیتی را در نظر بگیرید که می‌خواهید یک رستوران را در فید دسته‌ای حذف کنید. فقط باید نهاد رستوران را حذف کنید. موجودیت های فرعی مانند سرویس ها و منوها را حذف نکنید، زیرا به طور خودکار حذف می شوند.

نمونه درخواست حذف نهاد رستوران با شناسه https://www.provider.com/restaurant/12345 :

JSON

POST v1alpha/inventory/partners/PARTNER_ID/feeds/owg.v2/record:batchDelete
Host: mapsbooking.googleapis.com
Content-Type: application/json
{
  "records": [
    {
      "data_record": {
        "@type": "Restaurant",
        "@id": "https://www.provider.com/restaurant/12345"
      },
      "delete_time": "2022-08-19T17:11:10.750Z"
    }
  ]
}
    

پایه 64

مثال مشابه با یک بار رمزگذاری شده Base64.

POST v1alpha/inventory/partners/PARTNER_ID/feeds/owg.v2/record:batchDelete
Host: mapsbooking.googleapis.com
Content-Type: application/json
{
  "records": [
    {
      "data_record": "ewogICJAdHlwZSI6ICJSZXN0YXVyYW50IiwKICAiQGlkIjogImh0dHBzOi8vd3d3LnByb3ZpZGVyLmNvbS9yZXN0YXVyYW50LzEyMzQ1Igp9"
      "delete_time": "2022-08-19T17:11:10.750Z"
    }
  ]
}
    

اعتبارسنجی و کدهای پاسخ API

دو نوع اعتبار سنجی در تماس های API به روز رسانی بلادرنگ انجام می شود:

  • Request-level - این اعتبارسنجی‌ها بررسی می‌کنند که payload از طرح upsert یا delete پیروی می‌کند و هر data_record حاوی هر دو قسمت @id و @type است. این بررسی ها همزمان هستند و نتایج در بدنه پاسخ API برگردانده می شوند. یک کد پاسخ 200 و یک متن خالی JSON {} به این معنی است که این اعتبارسنجی‌ها تصویب شده و موجودیت‌های موجود در آن درخواست برای پردازش در صف قرار گرفتند. یک کد پاسخ متفاوت از 200 به این معنی است که یک یا چند مورد از این اعتبارسنجی ها ناموفق بوده و کل درخواست رد شده است (شامل همه موجودات موجود در بار). به عنوان مثال، اگر یک data_record فاقد یک @type باشد، پاسخ خطای زیر برگردانده می‌شود:

    {
      "error": {
        "code": 400,
        "message": "Record:{\"@id\":\"2717/86853/DELIVERY\",\"applicableServiceType\":[\"DELIVERY\",\"TAKEOUT\"],\"menuId\":[{\"@id\":\"2717/DELIVERY\",\"displayOrder\":1},{\"@id\":\"2717/TAKEOUT\",\"displayOrder\":2}],\"name\":\"Salad\",\"offeredById\":[\"2717\"]} has following errors: \nThe entity type could not be extracted from the entity value.\n",
        "status": "INVALID_ARGUMENT",
        "details": [
          {
            "@type": "type.googleapis.com/google.rpc.DebugInfo",
            "detail": "[ORIGINAL ERROR] generic::invalid_argument: Failed to parse one or more rtu records. Record:{\"@id\":\"2717/86853/DELIVERY\",\"applicableServiceType\":[\"DELIVERY\",\"TAKEOUT\"],\"menuId\":[{\"@id\":\"2717/DELIVERY\",\"displayOrder\":1},{\"@id\":\"2717/TAKEOUT\",\"displayOrder\":2}],\"name\":\"Salad\",\"offeredById\":[\"2717\"]} has following errors: \nThe entity type could not be extracted from the entity value.\n [google.rpc.error_details_ext] { message: \"Record:{\\\"@id\\\":\\\"2717/86853/DELIVERY\\\",\\\"applicableServiceType\\\":[\\\"DELIVERY\\\",\\\"TAKEOUT\\\"],\\\"menuId\\\":[{\\\"@id\\\":\\\"2717/DELIVERY\\\",\\\"displayOrder\\\":1},{\\\"@id\\\":\\\"2717/TAKEOUT\\\",\\\"displayOrder\\\":2}],\\\"name\\\":\\\"Salad\\\",\\\"offeredById\\\":[\\\"2717\\\"]} has following errors: \\nThe entity type could not be extracted from the entity value.\\n\" }"
          }
        ]
      }
    }
    
  • Entity-level - هر موجودیت موجود در محموله در برابر طرح رابطه ای تأیید می شود. مسائلی که در این مرحله از اعتبار سنجی با آن مواجه می شوند در پاسخ API گزارش نمی شوند. آنها فقط در داشبورد RTU Reporting گزارش می شوند.

سهمیه های API

به‌روزرسانی‌های بلادرنگ API دارای سهمیه 1500 درخواست در هر 60 ثانیه یا به طور متوسط ​​25 درخواست در ثانیه هستند. هنگامی که از یک سهمیه فراتر رود، Google با پیام خطای زیر پاسخ می دهد:

{
  "error": {
    "code": 429,
    "message": "Insufficient tokens for quota ...",
    "status": "RESOURCE_EXHAUSTED",
    "details": [...]
  }
}

برای انجام این کار، دوباره تماس را در فواصل زمانی بزرگتر تکرار کنید تا زمانی که موفق شود. اگر به طور منظم سهمیه را تمام می کنید، موجودیت های بیشتری را در یک درخواست API در نظر بگیرید. می توانید حداکثر 1000 موجودیت را در یک تماس API قرار دهید.

نمونه کد

در زیر چند نمونه از نحوه استفاده از API به روز رسانی بلادرنگ در زبان های مختلف آورده شده است. این نمونه‌ها از کتابخانه‌های Google Auth برای احراز هویت با استفاده از فایل کلید حساب سرویس ایجاد شده در حین تنظیم حساب استفاده می‌کنند. برای راه حل های جایگزین، به استفاده از OAuth 2.0 برای برنامه های کاربردی سرور به سرور مراجعه کنید. استفاده از طرح موجود در Generate Client Libraries را برای تولید کد منبع برای موجودی و انواع شیء به روز رسانی بلادرنگ در نظر بگیرید.

به روز رسانی نهادها

Node.js

این کد از کتابخانه تأیید Google برای Node.js استفاده می کند.

/* Sample code for Real-time update batchPush implementation.
 *
 * Required libraries:
 * - google-auth-library
 */

const {JWT} = require('google-auth-library');

// ACTION REQUIRED: Change this to the path of the service account client secret
// file downloaded from the Google Cloud Console.
const serviceAccountJson = require('./service-account.json');

// ACTION REQUIRED: Change this to your Partner ID received from Google.
// The Partner ID is available on the Partner Portal.
const PARTNER_ID = 1234;

const HOST = {
  prod: 'https://mapsbooking.googleapis.com',
  sandbox: 'https://partnerdev-mapsbooking.googleapis.com'
};

// ACTION REQUIRED: Change to 'prod' for production
const ENV = 'sandbox';

// Feed name for Order with Google including the version.
const FEED_NAME = 'owg.v2';

// Endpoint url
const url = `${HOST[ENV]}/v1alpha/inventory/partners/${PARTNER_ID}/feeds/${
    FEED_NAME}/record:batchPush`;

/**
 * Send a Real-time update request to update/insert entities
 */
async function batchUpsert(entities) {
  /**
   * Sign JWT token using private key from service account secret file
   * provided. The client can be created without providing a service account
   * secret file by implementing Application Default Credentials.
   * https://github.com/googleapis/google-auth-library-nodejs
   */
  const client = new JWT({
    email: serviceAccountJson.client_email,
    key: serviceAccountJson.private_key,
    scopes: ['https://www.googleapis.com/auth/mapsbooking'],
  });
  const request = {records: toPushRecords(entities)};
  const body = JSON.stringify(request);
  try {
    const response = await client.request({
      method: 'POST',
      url,
      data: body,
      headers: {'Content-Type': 'application/json'}
    });
    console.log('request body:', body);
    console.log('response status:', response.status);
    console.log(
        'response data:', response.data);  // successful response returns '{}'
  } catch (error) {
    console.log('error:', error);
  }
}

/**
 * Maps array of entities to records for batch push requests
 */
const toPushRecords = (entities) => {
  return entities.map((entity) => {
    // Using dateModified to set generation_timestamp. Defaulting to the
    // current timestamp for records that do not have dateModified.
    const generation_timestamp =
        entity.dateModified ? entity.dateModified : new Date().toISOString();
    return {data_record: btoa(JSON.stringify(entity)), generation_timestamp};
  });
};

// Call batchUpsert with example entities. dateModified is optional and is
// used to hold the actual timestamp when the entity was updated/created.
batchUpsert([
  {
    '@type': 'MenuItemOffer',
    '@id': '6680261',
    'menuItemId': '18931508',
    'price': 15.5,
    'priceCurrency': 'USD',
    'applicableServiceType': ['DELIVERY', 'TAKEOUT'],
    'inventoryLevel': 0,
    'dateModified': '2022-06-19T15:43:50.970Z'
  },
  {
    '@type': 'MenuItemOffer',
    '@id': '6680262',
    'menuItemId': '18931509',
    'price': 25.5,
    'priceCurrency': 'USD',
    'applicableServiceType': ['DELIVERY', 'TAKEOUT'],
    'inventoryLevel': 0,
    'dateModified': '2022-06-19T15:43:50.970Z'
  }
]);

پایتون

این کد از کتابخانه اعتبار گوگل برای پایتون استفاده می کند.

"""Sample code for the Real-time update batchPush implementation."""

# Required libraries:
# - google-auth

import base64
import datetime
import json
from google.auth.transport.requests import AuthorizedSession
from google.oauth2 import service_account

# ACTION REQUIRED: Change this to the Partner ID received from Google.
# Partner ID is available on the Partner Portal.
# https://partnerdash.google.com/apps/reservewithgoogle
_PARTNER_ID = '1234'

# ACTION REQUIRED: Change this to the path of the service account client secret
# file downloaded from the Google Cloud Console.
_SERVICE_ACCOUNT_KEY_JSON_FILE = 'service-account-creds.json'

_HOST_MAP = {
    'sandbox': 'https://partnerdev-mapsbooking.googleapis.com',
    'prod': 'https://mapsbooking.googleapis.com'
}

# ACTION REQUIRED: Change to 'prod' for production
_ENV = 'sandbox'

# Feed name for Order with Google including the version.
_FEED_NAME = 'owg.v2'

_ENDPOINT = '{}/v1alpha/inventory/partners/{}/feeds/{}/record:batchPush'.format(
    _HOST_MAP[_ENV], _PARTNER_ID, _FEED_NAME)


def batch_upsert(entities):
  """Makes a batchPush request using the Real-time updates REST service.

  Args:
      entities: The list of entity objects to update or add.
  """

  # Creates credentials by providing a json file. Credentials can also be
  # provided by implementing Application Default Credentials.
  # https://googleapis.dev/python/google-auth/latest/user-guide.html
  credentials = service_account.Credentials.from_service_account_file(
      _SERVICE_ACCOUNT_KEY_JSON_FILE,
      scopes=['https://www.googleapis.com/auth/mapsbooking'])
  authorized_session = AuthorizedSession(credentials)

  # JSON request object
  batch_request = {'records': [create_push_record(x) for x in entities]}
  response = authorized_session.post(_ENDPOINT, json=batch_request)
  print('request body:', json.dumps(batch_request))
  print('response status:', response.status_code)
  print('response data:', response.text)  # successful response returns '{}'


def create_push_record(entity):
  """Creates a record from an entity for batchPush requests.

  Args:
      entity: The entity object to create the record from.

  Returns:
      The constructed record for the batchPush request payload.
  """
  data_bytes = json.dumps(entity).encode('utf-8')
  base64_bytes = base64.b64encode(data_bytes)
  # Using dateModified to set generation_timestamp. Defaulting to the
  # current timestamp for records that do not have dateModified.
  generation_timestamp = entity.dateModified if 'dateModified' in entity else datetime.datetime.now(
  ).strftime('%Y-%m-%dT%H:%M:%S.%fZ')
  return {
      'generation_timestamp': generation_timestamp,
      'data_record': base64_bytes.decode('utf-8')
  }


# Call batch_upsert with example entities. dateModified is optional and is
# used to hold the actual timestamp when the entity was updated/created.
batch_upsert([{
    '@type': 'MenuItemOffer',
    '@id': '6680261',
    'menuItemId': '18931508',
    'price': 15.5,
    'priceCurrency': 'USD',
    'applicableServiceType': ['DELIVERY', 'TAKEOUT'],
    'inventoryLevel': 0,
    'dateModified': '2022-06-19T15:43:50.970Z'
}, {
    '@type': 'MenuItemOffer',
    '@id': '6680262',
    'menuItemId': '18931509',
    'price': 25.5,
    'priceCurrency': 'USD',
    'applicableServiceType': ['DELIVERY', 'TAKEOUT'],
    'inventoryLevel': 0,
    'dateModified': '2022-06-19T15:43:50.970Z'
}])

جاوا

این کد از کتابخانه تایید گوگل برای جاوا استفاده می کند.

مدل‌های کد منبع مشتری در بسته‌های rtusamples.inventory و rtusamples.realtime با دنبال کردن مراحل در Generate Client Libraries ایجاد شدند.

/*
 * Required Libraries:
 * - JDK >= 11
 * - google-auth-library-oauth2-http
 */
package rtusamples;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.auth.oauth2.AccessToken;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers;
import java.nio.charset.Charset;
import java.time.Clock;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Base64;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import rtusamples.inventory.MenuItemOffer;
import rtusamples.inventory.MenuItemOfferType;
import rtusamples.inventory.ServiceTypeElement;
import rtusamples.realtime.BatchPushGenericRecordRequest;
import rtusamples.realtime.GenericRecord;

/** Sample code for Real-time update batchPush implementation. */
public final class BasicPush {
  // ACTION REQUIRED: Change this to your Partner ID received from Google. The Partner ID is
  // available on the Partner Portal.
  private static final long PARTNER_ID = 12345678;

  // ACTION REQUIRED: Change this to the path of the service account client secret file downloaded
  // from the Google Cloud Console.
  private static final String JSON_KEY_FULL_PATH =
      "<path to your JSON credentials>/credentials.json";

  // ACTION REQUIRED: Change this to the endpoint that is needed.
  private static final String ENDPOINT =
      //    "https://partnerdev-mapsbooking.googleapis.com"; // for sandbox
      "https://mapsbooking.googleapis.com"; // for prod

  // Feed name for Order with Google including the version.
  private static final String FEED_NAME = "owg.v2";

  private static final ObjectMapper objectMapper = new ObjectMapper();

  private static final DateTimeFormatter TIMESTAMP_FORMATTER =
      DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[.SSS]'Z'");

  private static final Charset UTF_8 = Charset.forName("UTF-8");

  public static void main(String[] args) throws Exception {

    /**
     * Create credentials from service account secret file. Alternatively, the credentials can be
     * created by implementing Application Default Credentials.
     * https://github.com/googleapis/google-auth-library-java
     */
    // GoogleCredentials sourceCredentials =
    //     GoogleCredentials.getApplicationDefault()
    //         .createScoped(Arrays.asList("https://www.googleapis.com/auth/mapsbooking"));

    // ImpersonatedCredentials credentials =
    //     ImpersonatedCredentials.create(
    //         sourceCredentials,
    //         "fo-test@projectname.iam.gserviceaccount.com",
    //         null,
    //         Arrays.asList("https://www.googleapis.com/auth/mapsbooking"),
    //         300);

    GoogleCredentials credentials =
        GoogleCredentials.fromStream(new FileInputStream(JSON_KEY_FULL_PATH))
            .createScoped(Arrays.asList("https://www.googleapis.com/auth/mapsbooking"));

    // Create example MenuItemOffer entities, dateModified is optional and is used to hold
    // the actual timestamp when the entity was updated/created.
    MenuItemOffer menuItemOfferPizza = new MenuItemOffer();
    menuItemOfferPizza.setID("6680261");
    menuItemOfferPizza.setType(MenuItemOfferType.MENU_ITEM_OFFER);
    menuItemOfferPizza.setMenuItemID("18931508");
    menuItemOfferPizza.setPrice(15.5);
    menuItemOfferPizza.setPriceCurrency("USD");
    menuItemOfferPizza.setApplicableServiceType(
        new ServiceTypeElement[] {ServiceTypeElement.TAKEOUT, ServiceTypeElement.DELIVERY});
    menuItemOfferPizza.setInventoryLevel(0.0);
    menuItemOfferPizza.setDateModified("2022-10-07T13:00:00.000Z");

    MenuItemOffer menuItemOfferSalad = new MenuItemOffer();
    menuItemOfferSalad.setID("6680262");
    menuItemOfferSalad.setType(MenuItemOfferType.MENU_ITEM_OFFER);
    menuItemOfferSalad.setMenuItemID("18931509");
    menuItemOfferSalad.setPrice(25.5);
    menuItemOfferSalad.setPriceCurrency("USD");
    menuItemOfferSalad.setApplicableServiceType(
        new ServiceTypeElement[] {ServiceTypeElement.TAKEOUT, ServiceTypeElement.DELIVERY});
    menuItemOfferSalad.setInventoryLevel(0.0);
    menuItemOfferSalad.setDateModified("2022-10-07T13:00:00.000Z");

    // Example array of MenuItemOffer entities to update.
    List<MenuItemOffer> menuItemOffers = Arrays.asList(menuItemOfferPizza, menuItemOfferSalad);

    // Create list of GenericRecord from menuItemOffers.
    List<GenericRecord> menuItemOfferGenericRecords =
        menuItemOffers.stream()
            .map(
                (menuItemOffer) ->
                    toBatchPushRecord(menuItemOffer, menuItemOffer.getDateModified()))
            .collect(Collectors.toList());

    // List of records to be updated/created.
    List<GenericRecord> recordsToBeUpdated = new ArrayList<>();

    // Add list of menuItemOffer generic records.
    recordsToBeUpdated.addAll(menuItemOfferGenericRecords);

    // Request object that contains all records.
    BatchPushGenericRecordRequest batchPushRequest = new BatchPushGenericRecordRequest();
    batchPushRequest.setRecords(recordsToBeUpdated.toArray(new GenericRecord[0]));

    // Execute batchPush request.
    BasicPush basicPush = new BasicPush();
    basicPush.batchPush(batchPushRequest, credentials);
  }

  public void batchPush(
      BatchPushGenericRecordRequest batchPushRequest, GoogleCredentials credentials)
      throws IOException {

    credentials.refreshIfExpired();
    AccessToken token = credentials.getAccessToken();

    String requestBody = objectMapper.writeValueAsString(batchPushRequest);
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request =
        HttpRequest.newBuilder()
            .uri(
                URI.create(
                    String.format(
                        "%s/v1alpha/inventory/partners/%s/feeds/%s/record:batchPush",
                        ENDPOINT, PARTNER_ID, FEED_NAME)))
            .header("Content-Type", "application/json")
            .header("Authorization", String.format("Bearer %s", token.getTokenValue()))
            .POST(BodyPublishers.ofString(requestBody))
            .build();

    HttpResponse<String> response = null;
    try {
      response = client.send(request, BodyHandlers.ofString());
      System.out.println("Request body:" + requestBody);
      System.out.println("Response status:" + response.statusCode());
      System.out.println("Response body:" + response.body());
    } catch (IOException | InterruptedException e) {
      e.printStackTrace();
    }
  }

  public static <T> GenericRecord toBatchPushRecord(T entity, String dateModified) {
    GenericRecord genericRecord = new GenericRecord();
    try {
      String json = objectMapper.writeValueAsString(entity);
      genericRecord.setDataRecord(Base64.getEncoder().encodeToString(json.getBytes(UTF_8)));
      // Using dateModified to set generation_timestamp. Defaulting to the
      // current timestamp for records that do not have dateModified.
      String generationTimestamp =
          Optional.ofNullable(dateModified)
              .orElse(OffsetDateTime.now(Clock.systemUTC()).format(TIMESTAMP_FORMATTER));
      genericRecord.setGenerationTimestamp(generationTimestamp);
    } catch (JsonProcessingException e) {
      System.out.println(e.getMessage());
    }
    return genericRecord;
  }
}

حذف نهادها

Node.js

این کد از کتابخانه تأیید Google برای Node.js استفاده می کند.

/* Sample code for Real-time update batchDelete implementation.
 *
 * Required libraries:
 * - google-auth-library
 */

const {JWT} = require('google-auth-library');

// ACTION REQUIRED: Change this to the path of the service account client secret
// file downloaded from the Google Cloud Console.
const serviceAccountJson = require('./service-account.json');

// ACTION REQUIRED: Change this to your Partner ID received from Google.
// The Partner ID is available on the Partner Portal.
const PARTNER_ID = 1234;

const HOST = {
  prod: 'https://mapsbooking.googleapis.com',
  sandbox: 'https://partnerdev-mapsbooking.googleapis.com'
};

// ACTION REQUIRED: Change to 'prod' for production
const ENV = 'sandbox';

// Feed name for Order with Google including the version.
const FEED_NAME = 'owg.v2';

// Endpoint url
const url = `${HOST[ENV]}/v1alpha/inventory/partners/${PARTNER_ID}/feeds/${
    FEED_NAME}/record:batchDelete`;


/**
 * Send a Real-time update request to delete entities
 */
async function batchDelete(entities) {
  try {
    /**
     * Sign JWT token using private key from service account secret file
     * provided. The client can be created without providing a service account
     * secret file by implementing Application Default Credentials.
     * https://github.com/googleapis/google-auth-library-nodejs
     */
    const client = new JWT({
      email: serviceAccountJson.client_email,
      key: serviceAccountJson.private_key,
      scopes: ['https://www.googleapis.com/auth/mapsbooking'],
    });
    const request = {
      records: toDeleteRecords(entities)
    };
    const body = JSON.stringify(request);
    try {
      const response = await client.request({
        method: 'POST',
        url,
        data: body,
        headers: {'Content-Type': 'application/json'}
      });
      console.log('request body:', body);
      console.log('response status:', response.status);
      console.log('response data:', response.data);  // successful response returns '{}'
    } catch (error) {
      console.log('error:', error);
    }
  }

  /**
   * Maps array of entities to records for batch delete requests
   */
  const toDeleteRecords = (entities) => {
    return entities.map((entity) => {
      // Using dateModified to set delete_time. Defaulting to the current
      // timestamp for records that do not have dateModified.
      const delete_time =
          entity.dateModified ? entity.dateModified : new Date().toISOString();
      return {data_record: btoa(JSON.stringify(entity)), delete_time};
    });
  };

  // Call batchDelete with example entities. dateModified is optional and is
  // used to hold the actual timestamp when the entity was deleted.
  batchDelete([
    {
      '@type': 'Menu',
      '@id': '853706',
      'dateModified': '2022-06-19T15:43:50.970Z'
    },
    {
      '@type': 'Menu',
      '@id': '853705',
      'dateModified': '2022-06-19T15:13:00.280Z'
    }
  ]);

پایتون

این کد از کتابخانه اعتبار گوگل برای پایتون استفاده می کند.

"""Sample code for the Real-time update batchDelete implementation."""

# Required libraries:
# - google-auth

import base64
import datetime
import json
from google.auth.transport.requests import AuthorizedSession
from google.oauth2 import service_account

# ACTION REQUIRED: Change this to the Partner ID received from Google.
# Partner ID is available on the Partner Portal.
# https://partnerdash.google.com/apps/reservewithgoogle
_PARTNER_ID = '1234'

# ACTION REQUIRED: Change this to the path of the service account client secret
# file downloaded from the Google Cloud Console.
_SERVICE_ACCOUNT_KEY_JSON_FILE = 'service-account-creds.json'

_HOST_MAP = {
    'sandbox': 'https://partnerdev-mapsbooking.googleapis.com',
    'prod': 'https://mapsbooking.googleapis.com'
}

# ACTION REQUIRED: Change to 'prod' for production
_ENV = 'sandbox'

# Feed name for Order with Google including the version.
_FEED_NAME = 'owg.v2'

_ENDPOINT = '{}/v1alpha/inventory/partners/{}/feeds/{}/record:batchDelete'.format(
    _HOST_MAP[_ENV], _PARTNER_ID, _FEED_NAME)


def batch_delete(entities):
  """Makes a batch delete request using the Real-time updates REST service.

  Args:
      entities: The list of entity objects to delete.
  """

  # Creates credentials by providing a json file. Credentials can also be
  # provided by implementing Application Default Credentials.
  # https://googleapis.dev/python/google-auth/latest/user-guide.html
  credentials = service_account.Credentials.from_service_account_file(
      _SERVICE_ACCOUNT_KEY_JSON_FILE,
      scopes=['https://www.googleapis.com/auth/mapsbooking'])
  authorized_session = AuthorizedSession(credentials)

  # JSON request object
  batch_request = {'records': [create_delete_record(x) for x in entities]}
  response = authorized_session.post(_ENDPOINT, json=batch_request)
  print('request body:', json.dumps(batch_request))
  print('response status:', response.status_code)
  print('response data:', response.text)  # successful response returns '{}'


def create_delete_record(entity):
  """Creates a record from an entity for batchDelete requests.

  Args:
    entity: The entity object to create the record from.

  Returns:
    The constructed record for the batchDelete request payload.
  """
  data_bytes = json.dumps(entity).encode('utf-8')
  base64_bytes = base64.b64encode(data_bytes)
  # Using dateModified to set delete_time. Defaulting to the current
  # timestamp for records that do not have dateModified.
  delete_time = entity.dateModified if 'dateModified' in entity else datetime.datetime.now(
  ).strftime('%Y-%m-%dT%H:%M:%S.%fZ')
  return {
      'delete_time': delete_time,
      'data_record': base64_bytes.decode('utf-8')
  }


# Call batch_delete with example entities. dateModified is optional and is
# used to hold the actual timestamp when the entity was deleted.
batch_delete([{
    '@type': 'Menu',
    '@id': '853706',
    'dateModified': '2022-06-19T13:10:00.000Z'
}, {
    '@type': 'Menu',
    '@id': '853705',
    'dateModified': '2022-06-19T13:30:10.000Z'
}])

جاوا

این کد از کتابخانه تایید گوگل برای جاوا استفاده می کند.

مدل‌های کد منبع مشتری در بسته‌های rtusamples.inventory و rtusamples.realtime با دنبال کردن مراحل در Generate Client Libraries ایجاد شدند.

/*
 * Required Libraries:
 * - JDK >= 11
 * - google-auth-library-oauth2-http
 */
package rtusamples;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.auth.oauth2.AccessToken;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers;
import java.nio.charset.Charset;
import java.time.Clock;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Base64;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import rtusamples.inventory.Menu;
import rtusamples.inventory.MenuType;
import rtusamples.realtime.BatchDeleteGenericRecordsRequest;
import rtusamples.realtime.GenericDeleteRecord;

/** Sample code for the Real-time update batchDelete implementation. */
public final class BasicDelete {
  // ACTION REQUIRED: Change this to your Partner ID received from Google. The Partner ID is
  // available on the Partner Portal.
  private static final long PARTNER_ID = 123456789;

  // ACTION REQUIRED: Change this to the path of the service account client secret file downloaded
  // from the Google Cloud Console.
  private static final String JSON_KEY_FULL_PATH =
      "<path to your JSON credentials>/credentials.json";

  // ACTION REQUIRED: Change this to the endpoint that is needed.
  private static final String ENDPOINT =
      "https://partnerdev-mapsbooking.googleapis.com"; // for sandbox
  // "https://mapsbooking.googleapis.com" // for prod

  // Feed name for Order with Google including the version.
  private static final String FEED_NAME = "owg.v2";

  private static final ObjectMapper objectMapper = new ObjectMapper();

  private static final DateTimeFormatter TIMESTAMP_FORMATTER =
      DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[.SSS]'Z'");

  private static final Charset UTF_8 = Charset.forName("UTF-8");

  public static void main(String[] args) throws Exception {

    /**
     * Create credentials from service account secret file. Alternatively, the credentials can be
     * created by implementing Application Default Credentials.
     * https://github.com/googleapis/google-auth-library-java
     */
    // GoogleCredentials sourceCredentials =
    //     GoogleCredentials.getApplicationDefault()
    //         .createScoped(Arrays.asList("https://www.googleapis.com/auth/mapsbooking"));

    // ImpersonatedCredentials credentials =
    //     ImpersonatedCredentials.create(
    //         sourceCredentials,
    //         "fo-test@projectname.iam.gserviceaccount.com",
    //         null,
    //         Arrays.asList("https://www.googleapis.com/auth/mapsbooking"),
    //         300);

    GoogleCredentials credentials =
        GoogleCredentials.fromStream(new FileInputStream(JSON_KEY_FULL_PATH))
            .createScoped(Arrays.asList("https://www.googleapis.com/auth/mapsbooking"));

    // Create example Menu entities, dateModified is optional and is used to hold
    // the actual timestamp when the entity was deleted.
    Menu menuLunch = new Menu();
    menuLunch.setID("853705");
    menuLunch.setType(MenuType.MENU);
    menuLunch.setDateModified("2022-09-19T13:10:00.000Z");

    Menu menuDinner = new Menu();
    menuDinner.setID("853706");
    menuDinner.setType(MenuType.MENU);
    menuDinner.setDateModified("2022-09-19T13:13:10.000Z");

    // Example array of Menu entities to update.
    List<Menu> menus = Arrays.asList(menuLunch, menuDinner);

    // Create list of GenericDeleteRecord from menus.
    List<GenericDeleteRecord> menuGenericDeleteRecords =
        menus.stream()
            .map((menu) -> toBatchDeleteRecord(menu, menu.getDateModified()))
            .collect(Collectors.toList());

    // List of records to be deleted.
    List<GenericDeleteRecord> recordsToBeDeleted = new ArrayList<>();

    // Add list of menu generic records.
    recordsToBeDeleted.addAll(menuGenericDeleteRecords);

    // Request object that contains all records.
    BatchDeleteGenericRecordsRequest batchDeleteRequest = new BatchDeleteGenericRecordsRequest();
    batchDeleteRequest.setRecords(recordsToBeDeleted.toArray(new GenericDeleteRecord[0]));

    // Execute batchDelete request.
    BasicDelete basicDelete = new BasicDelete();
    basicDelete.batchDelete(batchDeleteRequest, credentials);
  }

  public void batchDelete(
      BatchDeleteGenericRecordsRequest batchDeleteRequest, GoogleCredentials credentials)
      throws IOException {

    credentials.refreshIfExpired();
    AccessToken token = credentials.getAccessToken();

    String requestBody = objectMapper.writeValueAsString(batchDeleteRequest);
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request =
        HttpRequest.newBuilder()
            .uri(
                URI.create(
                    String.format(
                        "%s/v1alpha/inventory/partners/%s/feeds/%s/record:batchDelete",
                        ENDPOINT, PARTNER_ID, FEED_NAME)))
            .header("Content-Type", "application/json")
            .header("Authorization", String.format("Bearer %s", token.getTokenValue()))
            .POST(BodyPublishers.ofString(requestBody))
            .build();

    HttpResponse<String> response = null;
    try {
      response = client.send(request, BodyHandlers.ofString());
      System.out.println("Request body:" + requestBody);
      System.out.println("Response status:" + response.statusCode());
      System.out.println("Response body:" + response.body());
    } catch (IOException | InterruptedException e) {
      e.printStackTrace();
    }
  }

  public static <T> GenericDeleteRecord toBatchDeleteRecord(T entity, String dateModified) {
    GenericDeleteRecord genericRecord = new GenericDeleteRecord();
    try {
      String json = objectMapper.writeValueAsString(entity);
      genericRecord.setDataRecord(Base64.getEncoder().encodeToString(json.getBytes(UTF_8)));
      // Using dateModified to set delete_time. Defaulting to the current
      // timestamp for records that do not have dateModified.
      String deleteTime =
          Optional.ofNullable(dateModified)
              .orElse(OffsetDateTime.now(Clock.systemUTC()).format(TIMESTAMP_FORMATTER));
      genericRecord.setDeleteTime(deleteTime);
    } catch (JsonProcessingException e) {
      System.out.println(e.getMessage());
    }
    return genericRecord;
  }
}

موارد استفاده کنید

موارد استفاده زیر نمونه‌هایی از به‌روزرسانی‌های بی‌درنگ، به‌روزرسانی‌های دسته‌ای فید، و محتوای در سطح بالا در تماس API هستند:

سناریو نهاد برای به روز رسانی توضیحات و جلوه ها
غیرفعال کردن یک سرویس Service

شما باید یک سرویس را به دلیل غیرقابل پیش بینی غیرفعال کنید.

به‌روزرسانی‌های بی‌درنگ: موجودیت Service مورد نظر را با تنظیم ویژگی isDisabled آن روی true به‌روزرسانی کنید، اما سایر ویژگی‌ها را یکسان نگه دارید.

فیدهای کامل: حتماً موجودیت را از فیدهای کامل به‌روزرسانی کنید تا isDisabled قبل از واکشی بعدی توسط Google روی true تنظیم شود، در غیر این صورت نهاد دوباره فعال می‌شود.

کالای خاص در انبار موجود نیست 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 .

زمان پردازش برای کارهای دسته ای و به روز رسانی در زمان واقعی

موجودی که از طریق فید دسته‌ای به‌روزرسانی یا حذف می‌شود، ظرف 2 ساعت پردازش می‌شود، در حالی که موجودی که از طریق به‌روزرسانی هم‌زمان به‌روزرسانی می‌شود، ظرف 5 دقیقه پردازش می‌شود. یک موجود قدیمی در 14 روز حذف می شود.

می‌توانید به Google ارسال کنید:

  • چندین کار دسته ای در روز برای به روز نگه داشتن موجودی خود، یا
  • یک کار دسته ای در روز و به روز رسانی در زمان واقعی برای به روز نگه داشتن موجودی شما.