Bu bölümde, envanter varlıklarınızın zamana bağlı güncellemelerini Google'a nasıl gönderebileceğiniz açıklanmaktadır. Gerçek zamanlı güncellemeler API'si, güncellemeleri aktarmanızı ve Korumalı Alan veya Üretim envanterinizdeki varlıkları neredeyse gerçek zamanlı olarak silmenizi sağlar.
Bu işlev öncelikli olarak acil durum kapanışları, menüden öğe kaldırma veya menü öğesinin fiyatını güncelleme gibi öngörülemeyen güncellemeler için tasarlanmıştır. Bu güncellemeler Google kullanıcı arayüzünde hızlı bir şekilde yansıtılmalıdır. Değişikliğinizin hemen yansıtılması gerekmiyorsa bunun yerine toplu beslemeyi kullanabilirsiniz. Gerçek zamanlı güncellemeler en fazla beş dakika içinde işlenir.
Ön koşullar
Gerçek zamanlı güncellemeleri uygulayabilmeniz için aşağıdakiler gereklidir:
- Maps Reservation API etkinse:
- GCP'de API'ler ve Hizmetler > Kitaplık'a gidin
- "Google Maps Reservation API" arayın
- Korumalı alan örneğini ("Google Maps Reservation API (Dev)") bulun ve Etkinleştir'i tıklayın
- Üretim örneğini ("Google Maps Reservation API") bulun ve Etkinleştir'i tıklayın.
- GCP projenizin düzenleyici rolüne sahip bir hizmet hesabı oluşturulur. Daha fazla bilgi için Hesap kurulumu bölümünü inceleyin.
- Üretim veya korumalı alan veri feed'leri barındırılır ve beslenir. Daha fazla bilgi için Toplu besleme bölümüne bakın.
- API kimlik doğrulaması için seçtiğiniz dilde Google İstemci kitaplığı'nı yüklemeniz önerilir. OAuth kapsamı olarak "https://www.googleapis.com/auth/mapsbooking" adresini kullanın. Aşağıda verilen kod örnekleri bu kitaplıkları kullanır. Aksi takdirde, Google API'lerine Erişmek için OAuth 2.0'ı Kullanma bölümünde açıklandığı gibi jeton değişimlerini manuel olarak gerçekleştirmeniz gerekir.
Genel bakış
Gerçek zamanlı güncellemeler API'si iki tür işlemi destekler. İlk işlem, mevcut varlıkları güncellemek içindir. İkinci işlem, varlıkları envanterinizden kaldırmak için silme işlemidir. Her iki işlem de istek gövdesinde listelenen bir varlık aralığında gerçekleştirilir. Tek bir API çağrısında 1.000'e kadar varlığa güncelleme yapabilirsiniz. API, gelen tüm istekleri kabul eder ve işlenmeleri için bunları sıraya alır. Bu nedenle, RTU istekleri eşzamansız olarak işlenir.
Gerçek zamanlı güncellemeler API'si iki ortamda çalışır: korumalı alan ve üretim. Korumalı alan ortamı, API isteklerini test etmek ve üretim ortamını test etmek için kullanılır. Her iki ortamın ana makine adları:
- Korumalı alan -
partnerdev-mapsbooking.googleapis.com
- Üretim -
mapsbooking.googleapis.com
Uç noktalar
Gerçek zamanlı güncellemeler API'si, envanter güncellemeleri için gelen istekleri işlemek üzere iki uç nokta gösterir:
- EKSİKSİZ -
/v1alpha/inventory/partners/
PARTNER_ID/feeds/owg.v2/record:batchPush
- SİL -
/v1alpha/inventory/partners/
PARTNER_ID/feeds/owg.v2/record:batchDelete
PARTNER_ID parametresi, aşağıdaki ekran görüntüsünde gösterildiği gibi Hesap ve kullanıcılar sayfasında İş Ortağı Kimliği olarak gösterilen Actions Center'da bulunabilir.
Yukarıdaki ekran görüntüsünde örnek olarak PARTNER_ID değeri olarak 10000001 kullanılırsa korumalı alanda ve üretimde API istekleri göndermek için tam URL'ler aşağıdaki örneklerde gösterildiği gibi olacaktır.
# 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
Varlıklar güncelleniyor
Envanterinizdeki varlıkları güncellemek için UPSERT uç noktasını kullanın ve HTTP POST istekleri gönderin. Her POST isteği, envanter şemasında listelenen herhangi bir varlık türünün yapılandırılmış verilerini içeren JSON yüküyle birlikte PARTNER_ID parametresini içermelidir.
Upsert istek yükü
İsteğin gövdesi, kayıt listesini içeren bir JSON nesnesidir. Her kayıt, güncellenen bir varlığa karşılık gelir. Base64'te kodlanmış varlık yükünün bulunduğu data_record
alanından ve varlık güncellemesinin zamanını belirten generation_timestamp
alanından oluşur:
{ "records": [ { "data_record":"BASE_64_ENCODED_ENTITY", "generation_timestamp":"UPDATE_TIMESTAMP" } ] }
Yukarıdaki yükte aşağıdakileri değiştirin:
BASE_64_ENCODED_ENTITY: Varlıkın Base64 olarak kodlanmış JSON dizesi. Kodu çözülmüş varlık JSON dosyası, feed spesifikasyonundakiyle aynı yapıya sahip olmalıdır. Örneğin:
{"@type":"MenuSection","name":"My Updated Menu Section","menuId":{"@id":"10824","displayOrder":1},"@id":"853705"}
UPDATE_TIMESTAMP: Arka uç sistemlerinizde varlığın oluşturulduğu zamanın zaman damgasını eklediğinizden emin olun. Bu zaman damgası, envanter güncellemelerinin doğru sıralanmasını sağlamak için kullanılır. Bu alan dahil edilmezse Google'ın isteği aldığı zamana ayarlanır.
batchPush
isteği aracılığıyla bir varlığı güncellerken varlık sürümü oluşturma içingeneration_timestamp
alanı kullanılır. İlişkisel envanter şemasında beklenen zaman değerlerinin biçimini görün.
Her gerçek zamanlı güncelleme isteği aşağıdaki koşulları karşılamalıdır:
- Yük gövdesinin boyutu 5 MB'ı aşmamalıdır. Toplu feed'lere benzer şekilde, daha fazla veri sığdırmak için boşlukları kaldırmanızı öneririz.
- Bir
batchPush
isteğinde en fazla 1.000 varlık olabilir.
Örnekler
1. Örnek: Bir restoranı güncelleme
Bir restoranın telefon numarasını acilen güncellemeniz gerektiğini varsayalım. Güncellemeniz tüm restorana ait JSON dosyasını içerir.
Aşağıdakine benzer bir toplu feed düşünün:
{ "@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 }
Bu durumda HTTP POST tarafından gerçek zamanlı güncellemeniz şöyle olur:
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 kodlamalı yük için de aynı örnek.
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. Örnek: Birden fazla restoranı güncelleme
Tek bir API çağrısında iki restoran varlığını güncellemek için HTTP POST isteği aşağıdaki gibi olur:
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 kodlamalı yük için de aynı örnek.
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. Örnek: Menü öğesi fiyatını güncelleme
Menüdeki bir ürünün fiyatını değiştirmeniz gerektiğini varsayalım.
Aşağıdaki gibi görünen bir toplu feed düşünün:
{ "@type": "MenuItemOffer", "@id": "menuitemoffer6680262", "sku": "offer-cola", "menuItemId": "menuitem896532", "price": 2, "priceCurrency": "USD" }
Bu durumda POST aracılığıyla gerçek zamanlı güncellemeniz şöyle olur:
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 kodlamalı yük için de aynı örnek.
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" } ] }
Varlık ekleme
Veri tutarsızlıklarına neden olabileceğinden yeni varlıklar eklemek için gerçek zamanlı güncellemeleri kullanmayın. Bunun yerine, toplu besleme için açıklandığı gibi toplu feed işlemini kullanın.
Varlıkları silme
Varlıkları envanterinizden silmek için DELETE uç noktasını kullanın ve HTTP POST istekleri gönderin. Her POST isteği, envanterinizdeki herhangi bir varlığın tanımlayıcısını içeren JSON yüküyle birlikte PARTNER_ID parametresini içermelidir.
İstek yükünü sil
Silme isteğinin gövdesi, güncelleme isteğine benzer bir şekilde yapılandırılır.
Ayrıca, data_record
ve delete_time
alanları olan bir kayıt listesine de sahiptir:
{ "records": [ { "data_record":"BASE_64_ENCODED_REFERENCE", "delete_time": "DELETE_TIMESTAMP" } ] }
Yukarıdaki yükte aşağıdakileri değiştirin:
BASE_64_ENCODED_REFERENCE: Kaldırılan varlığın referansının Base64 olarak kodlanmış JSON dizesi. Referans yalnızca varlık türü ve tanımlayıcıdan oluşur (örneğin, bir MenuSection referansının JSON gösterimi):
{"@type":"MenuSection","@id":"853705"}
DELETE_TIMESTAMP: Arka uç sisteminizde varlığın silindiği zamanı gösteren zaman damgasını eklediğinizden emin olun. Bu zaman damgası, silme işleminin envantere uygulanacağı sırayı belirlemek için kullanılır.
Bir batchDelete
isteğinde en fazla 1.000 varlık olabilir.
Örnekler
1. Örnek: İki MenuItem
varlığını kaldırma
Tek bir API çağrısında iki menü öğesini kaldırmak için HTTP POST isteği aşağıdaki gibi olur:
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 kodlamalı yük için de aynı örnek.
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. Örnek: Restaurant
varlığını silme
Toplu feed'de bir restoranı silmek istediğiniz bir durum düşünün. Yalnızca restoran varlığını silmelisiniz. Otomatik olarak kaldırılacakları için hizmetler ve menüler gibi alt varlıkları silmeyin.
https://www.provider.com/restaurant/12345
kimliğine sahip restoran varlığını silmek için örnek istek:
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 kodlamalı yük için de aynı örnek.
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" } ] }
Doğrulama ve API yanıt kodları
Gerçek zamanlı güncelleme API çağrılarında gerçekleştirilen iki tür doğrulama vardır:
İstek düzeyi: Bu doğrulamalar, yükün üst veya sil şemasını izleyip izlemediğini ve her
data_record
'un hem@id
hem de@type
alanlarını içerip içermediğini kontrol eder. Bu kontroller eşzamanlıdır ve sonuçlar API yanıt gövdesinde döndürülür. Yanıt kodu 200 ve boş bir JSON gövdesi ({}
), bu doğrulamaların geçildiği ve bu istekteki varlıkların işlenmek üzere sıraya alındığı anlamına gelir. 200'den farklı bir yanıt kodu, bu doğrulamalardan birinin veya birkaçının başarısız olduğu ve isteğin tamamının (yükteki tüm varlıklar dahil) reddedildiği anlamına gelir. Örneğin, birdata_record
öğesinde@type
eksikse aşağıdaki hata yanıtı döndürülür:{ "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\" }" } ] } }
Varlık düzeyi: Yükteki her varlık, ilişkisel şemaya göre doğrulanır. Doğrulamanın bu aşamasında karşılaşılan sorunlar API yanıtında bildirilmez. Bunlar yalnızca RTU Raporlama kontrol panelinde raporlanır.
API kotaları
Gerçek zamanlı API güncellemeleri kotası, her 60 saniyede 1.500 istek veya saniyede ortalama 25 istektir. Bir kota aşıldığında Google aşağıdaki hata mesajıyla yanıt verir:
{ "error": { "code": 429, "message": "Insufficient tokens for quota ...", "status": "RESOURCE_EXHAUSTED", "details": [...] } }
Bunu başarmak için, işlem başarılı olana kadar katlanarak artan aralıklarla çağrıyı tekrar deneyin. Kotayı düzenli olarak tüketiyorsanız bir API isteğine daha fazla varlık eklemeyi düşünebilirsiniz. Bir API çağrısına 1.000'e kadar varlık ekleyebilirsiniz.
Kod örnekleri
Aşağıda, gerçek zamanlı güncelleme API'sinin çeşitli dillerde nasıl kullanılacağına dair bazı örnekler verilmiştir. Bu örnekler, Hesap kurulumu sırasında oluşturulan bir hizmet hesabı anahtar dosyasıyla kimlik doğrulamak için Google Kimlik Doğrulama Kitaplıkları'nı kullanır. Alternatif çözümler için Sunucudan Sunucuya Uygulamalar için OAuth 2.0'ı Kullanma sayfasına bakın. Envanter ve gerçek zamanlı güncelleme nesnesi türleri için kaynak kodu oluşturmak amacıyla İstemci Kitaplıkları Oluşturma bölümünde bulunan şemayı kullanabilirsiniz.
Varlıklar güncelleniyor
Node.js
Bu kod, Node.js için Google kimlik doğrulama kitaplığını kullanır.
/* 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
Bu kod, Python için Google kimlik doğrulama kitaplığını kullanır.
"""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
Bu kod, Java için Google kimlik doğrulama kitaplığını kullanır.
rtusamples.inventory
ve rtusamples.realtime
paketlerindeki istemci kaynak kodu modelleri İstemci Kitaplıkları Oluşturma başlıklı makaledeki adımlar uygulanarak oluşturulmuştur.
/* * 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; } }
Varlıkları kaldırma
Node.js
Bu kod, Node.js için Google kimlik doğrulama kitaplığını kullanır.
/* 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
Bu kod, Python için Google kimlik doğrulama kitaplığını kullanır.
"""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
Bu kod, Java için Google kimlik doğrulama kitaplığını kullanır.
rtusamples.inventory
ve rtusamples.realtime
paketlerindeki istemci kaynak kodu modelleri İstemci Kitaplıkları Oluşturma başlıklı makaledeki adımlar uygulanarak oluşturulmuştur.
/* * 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; } }
Kullanım alanları
Aşağıdaki kullanım alanları; gerçek zamanlı güncellemeler, toplu feed güncellemeleri ve API çağrısındaki üst düzeydeki içeriğe örneklerdir:
Senaryo | Güncellenecek varlık | Açıklama ve efektler |
---|---|---|
Bir hizmeti devre dışı bırakma | Service |
Beklenmeyen bir nedenden dolayı bir hizmeti devre dışı bırakmanız gerekiyorsa. Gerçek zamanlı güncellemeler: Söz konusu Tam feed'ler: Tam feed'lerdeki varlığı, Google tarafından bir sonraki getirme işleminden önce |
Belirli bir ürün stokta yok | MenuItemOffer |
Gerçek zamanlı güncellemeler: Kapsayıcı MenuItemOffer varlığını inventoryLevel , belirtilen MenuItem için 0 değerine ayarlanmış olarak ve diğer tüm verileri değiştirmeden gönderin. |
Menü öğesi fiyat değişikliği | MenuItemOffer |
Gerçek zamanlı güncellemeler: price içeren kapsayıcı MenuItemOffer varlığını, belirtilen MenuItem için güncellenmiş fiyata ayarlayın ve diğer hiçbir veriyi değiştirmeden gönderin. |
Yeni üst düzey öğe ekle Yalnızca |
Menu , Restaurant Service |
Örneğin, bir restorana yeni bir menü eklemeniz gerekiyor. Tam feed'ler: Varlığı veri feed'lerinize ekleyin ve toplu beslemeyi bekleyin. |
Üst düzey öğeyi kalıcı olarak silme Yalnızca |
Menu , Restaurant Service |
Gerçek zamanlı güncellemeler: Açık silme gönderin. Tam feed'ler: Google tarafından bir sonraki getirme işleminden önce varlığı tam feed'lerden kaldırdığınızdan emin olun. Aksi takdirde öğe yeniden eklenir. |
Belirli bir Service alanına yeni teslimat bölgesi ekleyin |
ServiceArea |
Toplu feed'ler: Söz konusu ServiceArea varlığını tüm alanları olduğu gibi tam feed'lerde yaptığınız gibi gönderin ve yeni yayınlama alanı polygon , geoRadius veya postalCode içinde belirtilir. |
Service konumunda teslimat için tahmini varış zamanını güncelleyin |
ServiceHours |
Toplu feed'ler: ServiceHours öğesi, feed'lerdekiyle aynı şekilde gönderilir ancak leadTimeMin buna uygun şekilde güncellenir. |
Service ayındaki teslimat fiyatlarını güncelle |
Fee |
Toplu feed'ler: price güncellenmiş olarak Fee tarihinde tam yayını gönderin. |
Service konumunda teslimat veya paket servisi saatlerini güncelleyin |
ServiceHours |
Toplu feed'ler: ServiceHours öğesini, feed'lerdekiyle aynı şekilde gönderin ancak opens ve closes özellikleri uygun şekilde güncellenir. |
Service (min. sipariş tutarını değiştir) |
Fee |
Toplu feed'ler: minPrice (güncellenmiş) dahil olmak üzere tam Fee gönderin |
MenuItem öğesini kalıcı olarak silme |
Menu |
Toplu feed'ler: MenuItem öğesini, feed'lerdekiyle aynı şekilde gönderin, ancak parentMenuSectionId alanını boş bırakın.
|
Toplu işler ve gerçek zamanlı güncellemeler için işlem süreleri
Toplu feed aracılığıyla güncellenen veya silinen bir varlık 2 saat içinde işlenir. Gerçek zamanlı güncellemeyle güncellenen bir varlık ise 5 dakika içinde işlenir. Eski bir varlık 14 gün içinde silinir.
Google'a şu yöntemlerden birini gönderebilirsiniz:
- Envanterinizi güncel tutmak için günde birden fazla toplu iş YA DA
- Her gün bir toplu iş ve gerçek zamanlı güncellemelerle envanterinizi güncel tutun.