يوضّح هذا القسم كيفية إرسال تعديلات حسّاسة للوقت في مستودعك كياناتك إلى Google. تتيح لك واجهة برمجة التطبيقات لتعديلات الوقت الفعلي إمكانية نشر التعديلات وحذف العناصر في المستودع التجريبي أو المستودع العلني في الوقت الفعلي تقريبًا.
هذه الوظيفة مخصّصة في المقام الأول للتعديلات التي لا يمكنك توقّعها، مثل عمليات الإغلاق في حالات الطوارئ أو إزالة عناصر من القائمة أو تعديل سعر أحد عناصر القائمة، والتي يجب أن تظهر بسرعة في واجهة مستخدِم Google. إذا لم يكن عليك تطبيق التغيير على الفور، يمكنك استخدام ميزة نقل البيانات المجمّعة بدلاً من ذلك. تتم معالجة التعديلات في الوقت الفعلي في غضون خمس دقائق كحد أقصى.
المتطلبات الأساسية
يجب استيفاء العناصر التالية قبل تنفيذ ميزة "التعديلات في الوقت الفعلي":
- تم تفعيل Maps Booking API:
- في Google Cloud Platform، انتقِل إلى APIs & Services (واجهات برمجة التطبيقات والخدمات) > Library (المكتبة).
- ابحث عن "Google Maps Booking API".
- ابحث عن مثيل Sandbox ("Google Maps Booking API (Dev)") وانقر على تفعيل.
- ابحث عن نسخة الإصدار العلني ("Google Maps Booking API") وانقر على تفعيل .
- يتم إنشاء حساب خدمة بدور المحرِّر في مشروعك على Google Cloud Platform (GCP). لمزيد من التفاصيل، يُرجى الاطّلاع على إعداد الحساب.
- يتم استضافة خلاصات بيانات الإصدار العلني أو ميزة "المساحة الرملية" ونقل بياناتها. لمزيد من التفاصيل، راجِع نقل البيانات المجمّعة.
- لمصادقة واجهة برمجة التطبيقات، ننصحك بتثبيت مكتبة Google Client library بلغتك المفضّلة. استخدِم "https://www.googleapis.com/auth/mapsbooking" كنطاق OAuth. وتستخدم نماذج الرموز البرمجية المضمّنة أدناه هذه المكتبات. بخلاف ذلك، عليك معالجة عمليات تبادل الرموز المميّزة يدويًا كما هو موضّح في استخدام بروتوكول OAuth 2.0 للوصول إلى Google APIs.
نظرة عامة
تتيح واجهة برمجة التطبيقات التعديلات في الوقت الفعلي نوعَين من العمليات. العملية الأولى هي upsert لتعديل العناصر الحالية. أما العملية الثانية فهي "حذف" لإزالة العناصر من مستودعك. يتم تنفيذ كل من العمليتين على نطاق من الكيانات المدرَجة في نص الطلب. يمكنك إجراء تعديلات على ما يصل إلى 1,000 عنصر في طلب واحد من واجهة برمجة التطبيقات. تقبل واجهة برمجة التطبيقات جميع الطلبات الواردة وتضعها في قائمة انتظار لإجراء المزيد من المعالجة. لذلك، تتم معالجة طلبات RTU بشكل غير متزامن.
تعمل واجهة برمجة التطبيقات لميزة "التعديلات في الوقت الفعلي" في بيئتين: بيئة المحاكاة والإنتاج. تُستخدَم بيئة الاختبار التجريبي لاختبار طلبات واجهة برمجة التطبيقات وبيئة الإنتاج لتعديل المحتوى المرئي لمستخدمي ميزة "الطلب من خلال تجربة سلسة". أسماء المضيفين في كلتا البيئتَين:
- وضع الحماية -
partnerdev-mapsbooking.googleapis.com
- الإنتاج -
mapsbooking.googleapis.com
نقاط النهاية
تعرض واجهة برمجة التطبيقات لتعديلات الوقت الفعلي نقطتَي نهاية لمعالجة الطلبات الواردة لتعديلات المستودع:
- UPSERT -
/v1alpha/inventory/partners/
PARTNER_ID/feeds/owg.v2/record:batchPush
- حذف -
/v1alpha/inventory/partners/
PARTNER_ID/feeds/owg.v2/record:batchDelete
يمكن العثور على المَعلمة PARTNER_ID في مركز الإجراءات المعروضة باسم رقم تعريف الشريك في صفحة الحساب والمستخدِمون، كما هو موضّح في لقطة الشاشة أدناه.
على سبيل المثال، إذا كانت القيمة PARTNER_ID هي 10000001 من screenshot أعلاه، ستظهر عناوين URL الكاملة لإرسال طلبات واجهة برمجة التطبيقات في بيئة المحاكاة و الإنتاج على النحو الموضّح في الأمثلة أدناه.
# 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، وأرسِل طلبات POST عبر بروتوكول HTTP. يجب أن يتضمّن كل طلب POST المَعلمة PARTNER_ID بالإضافة إلى الحمولة بتنسيق JSON التي تحتوي على البيانات المنظَّمة لأي نوع من أنواع الكيانات المدرَجة في مخطّط المستودع.
حمولة طلب Upsert
نص الطلب هو عنصر 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 ميغابايت. على غرار الخلاصات المُجمَّعة، ننصحك بإزالة المسافات البيضاء من أجل تكييف المزيد من البيانات.
- يمكن أن يتضمّن طلب
batchPush
ما يصل إلى 1,000 عنصر.
أمثلة
المثال 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" } ] }
Base64
المثال نفسه مع حمولة مشفَّرة بترميز 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: تعديل بيانات عدة مطاعم
لتعديل عنصرَي مطعم في طلب واحد من واجهة برمجة التطبيقات، سيكون طلب 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" } ] }
Base64
المثال نفسه مع حمولة مشفَّرة بترميز 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" } ] }
Base64
المثال نفسه مع حمولة مشفَّرة بترميز 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 نقطة النهاية وأرسِل طلبات POST عبر بروتوكول HTTP. يجب أن يحتوي كل طلب 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: احرص على تضمين الطابع الزمني لوقت حذف العنصر في نظامك الداخلي. يُستخدَم الطابع الزمني لتحديد الترتيب الذي سيتم فيه تطبيق عملية الحذف على المستودع.
يمكن أن يتضمّن طلب batchDelete
ما يصل إلى 1,000 عنصر.
أمثلة
المثال 1: إزالة كيانَين من MenuItem
لإزالة عنصرَين من القائمة في طلب واحد من واجهة برمجة التطبيقات، سيكون طلب 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" } ] }
Base64
المثال نفسه مع حمولة مشفَّرة بترميز 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" } ] }
Base64
المثال نفسه مع حمولة مشفَّرة بترميز 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" } ] }
رموز التحقّق ورموز استجابة واجهة برمجة التطبيقات
هناك نوعان من عمليات التحقّق التي يتم إجراؤها على طلبات البيانات من واجهة برمجة التطبيقات لتعديل البيانات في الوقت الفعلي:
على مستوى الطلب: تتحقّق عمليات التحقّق هذه من أنّ الحمولة تتبع مخطّط upsert أو delete ، وأنّ كل
data_record
يحتوي على الحقلين@id
و@type
. تكون عمليات التحقّق هذه متزامنة ويتم عرض النتائج في ملف محتوى الردّ من واجهة برمجة التطبيقات. يعني رمز الاستجابة 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\" }" } ] } }
على مستوى الكيان: يتم التحقّق من صحة كلّ عنصر في الحمولة مقارنةً ب المخطّط العلائقي. لا يتم تسجيل المشاكل التي تواجهها في هذه المرحلة من عملية التحقّق في استجابة واجهة برمجة التطبيقات. ولا يتم تسجيلها إلّا في لوحة بيانات إعداد تقارير RTU.
حصص واجهة برمجة التطبيقات
تبلغ حصة تعديلات واجهة برمجة التطبيقات في الوقت الفعلي 1,500 طلب كل 60 ثانية، أو 25 طلبًا في الثانية في المتوسّط. عند تجاوز الحصة، تردّ Google برسالة الخطأ التالية:
{ "error": { "code": 429, "message": "Insufficient tokens for quota ...", "status": "RESOURCE_EXHAUSTED", "details": [...] } }
لحلّ هذه المشكلة، يُرجى إعادة محاولة إجراء المكالمة مرة أخرى على فترات زمنية أكبر بشكلٍ كبير إلى أن يتم إتمامها بنجاح. إذا كنت تستنفد الحصة بشكل منتظم، ننصحك بتضمين المزيد من الكيانات في طلب واحد من واجهة برمجة التطبيقات. يمكنك تضمين ما يصل إلى 1,000 عنصر في طلب واحد عبر واجهة برمجة التطبيقات.
عيّنات تعليمات برمجية
في ما يلي بعض النماذج عن كيفية استخدام واجهة برمجة التطبيقات لميزة "التعديل في الوقت الفعلي" بلغات مختلفة. تستخدِم هذه العيّنات مكتبات Google Auth للمصادقة باستخدام ملف مفتاح حساب الخدمة الذي تم إنشاؤه أثناء إعداد الحساب. للحصول على حلول بديلة، يُرجى الرجوع إلى مقالة استخدام OAuth 2.0 لتطبيقات الخادم إلى الخادم. ننصحك باستخدام المخطّط المتاح في إنشاء مكتبات العملاء لإنشاء رمز المصدر لأنواع عناصر المستودع والتعديل في الوقت الفعلي.
تعديل الكيانات
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' } ]);
Python
تستخدِم هذه التعليمات البرمجية مكتبة مصادقة Google لبرنامج Python.
"""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' }])
Java
تستخدِم هذه الرموز البرمجية مكتبة مصادقة Google للغة Java.
تم إنشاء نماذج رمز المصدر للعملاء في الحِزم rtusamples.inventory
وrtusamples.realtime
من خلال اتّباع الخطوات الواردة في مقالة إنشاء مكتبات العملاء.
/* * 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' } ]);
Python
تستخدِم هذه التعليمات البرمجية مكتبة مصادقة Google لبرنامج Python.
"""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' }])
Java
تستخدِم هذه الرموز البرمجية مكتبة مصادقة Google للغة Java.
تم إنشاء نماذج رمز المصدر للعميل في الحِزم rtusamples.inventory
وrtusamples.realtime
من خلال اتّباع الخطوات الواردة في مقالة إنشاء مكتبات العميل.
/* * 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; } }
حالات الاستخدام
في ما يلي أمثلة على حالات الاستخدام التي تتضمن تعديلات في الوقت الفعلي وتعديلات على الخلاصات المجمّعة، والمحتوى على مستوى عالٍ في طلب البيانات من واجهة برمجة التطبيقات:
السيناريو | العنصر المطلوب تعديله | الوصف والتأثيرات |
---|---|---|
إيقاف خدمة | Service |
إذا كنت بحاجة إلى إيقاف خدمة لسبب غير متوقَّع التعديلات في الوقت الفعلي: عدِّل عنصر الخلاصات الكاملة: احرص على تعديل الكيان من الخلاصات الكاملة
لضبط |
سلعة معيّنة غير متوفّرة | MenuItemOffer |
التعديلات في الوقت الفعلي: أرسِل عنصر MenuItemOffer
المُغلف مع ضبط inventoryLevel على 0 لMenuItem
المحدَّد، وبدون تغيير أي بيانات أخرى. |
تغيير في سعر عنصر قائمة | MenuItemOffer |
التعديلات في الوقت الفعلي: أرسِل عنصر MenuItemOffer
المحفوظ في عنصر آخر مع ضبط price على السعر المعدَّل لMenuItem معيّن، مع عدم تغيير جميع البيانات الأخرى. |
إضافة كيان جديد من المستوى الأعلى لا تنطبق إلا على الكيانات من الأنواع |
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 دقائق. يتم حذف العناصر القديمة بعد 14 يومًا.
يمكنك إرسال ما يلي إلى Google:
- مهام مجمّعة متعددة في اليوم للحفاظ على حداثة المستودع
- مهمة مجمّعة واحدة في اليوم وتعديلات في الوقت الفعلي للحفاظ على حداثة مستودعك