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. Artımlı Güncelleme API'si, Korumalı Alan veya Üretim envanterinizdeki güncellemeleri neredeyse gerçek zamanlı olarak aktarmanıza ve bunları silmenize olanak tanır.
Bu işlev temel olarak, acil durum kapanışları gibi öngörülemeyen güncellemelere yöneliktir. Kural olarak, Artımlı Güncelleme API'si aracılığıyla gönderilen tüm değişiklikler en fazla bir saat içinde yayınlanması gereken bir değişiklik olmalıdır. Değişikliğinizin hemen yansıtılması gerekmiyorsa bunun yerine toplu beslemeyi kullanabilirsiniz. Artımlı güncellemeler en fazla beş dakika içinde işlenir.
Ön koşullar
Artımlı güncellemeleri uygulamadan önce aşağıdakiler gereklidir:
- Actions projenizde düzenleyici rolüne sahip bir hizmet hesabı oluşturulur. Daha fazla bilgi için Proje oluşturma ve ayarlama sayfası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.
- (İsteğe bağlı, ancak önerilir) API'yi çağırırken OAuth 2.0'ı kullanmayı kolaylaştırmak için Google İstemci kitaplığını istediğiniz dilde yükleyin. 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.
Uç noktalar
Aşağıdaki isteklerde aşağıdakileri değiştirin:
- PROJECT_ID: Proje oluşturma ve ayarlama bölümünde oluşturduğunuz projeyle ilişkili Google Cloud proje kimliği.
- TYPE: Veri feed'inizdeki güncellemek istediğiniz nesnenin varlık türü (
@type
özelliği). - ENTITY_ID (yalnızca uç noktayı silme): Silinecek varlığın kimliği. Varlık kimliğinizi URL ile kodladığınızdan emin olun.
- DELETE_TIME (yalnızca uç noktayı sil): Sistemlerinizde varlığın silindiği zamanı belirtmek için isteğe bağlı bir alandır (varsayılan olarak istek alındığı zamandır). Zaman değeri gelecekte olmamalıdır. Artımlı bir çağrı aracılığıyla bir varlık gönderirken varlık sürümü oluşturma, silme çağrısı durumunda
delete_time
alanını da kullanır. Bu değeriyyyy-mm-ddTHH:mm:ssZ
olarak biçimlendirin
Uç noktayı güncelleme
Bir varlığı değiştirmek için aşağıdaki uç noktaya bir HTTP POST isteği gönderin ve güncellemeler ile eklemeler yükünü ekleyin. Tek bir API çağrısında en fazla 1.000 varlık için güncelleme yapabilirsiniz.
https://actions.googleapis.com/v2/apps/PROJECT_ID/entities:batchPush
Örneğin, "delivery-provider-id" kimliğine sahip bir projedeki varlıkları güncellemek istiyorsanız uç nokta şu olur:
https://actions.googleapis.com/v2/apps/delivery-provider-id/entities:batchpush
Uç noktayı silme
Envanterinizdeki bir varlığı silmek için aşağıdaki uç noktaya bir HTTP DELETE isteği gönderin.
https://actions.googleapis.com/v2/apps/PROJECT_ID/entities/TYPE/ENTITY_ID?entity.vertical=FOODORDERING&delete_time=DELETE_TIME
Örneğin, "delivery-provider-id" projenizden "menuSection_122" kimliğine sahip bir "MenüSection" varlığını silmek için, aşağıdakilere yönelik bir HTTP DELETE API çağrısı yaparsınız:
https://actions.googleapis.com/v2/apps/delivery-provider-id/entities/MenuSection/menuSection_122?entity.vertical=FOODORDERING
Korumalı alan ortamı
Korumalı alan envanterinizde Incremental Update API'yi kullanmak için yukarıdaki Uç Noktalar bölümünde verilen yönergeleri uygulayın, ancak /v2/apps/
yerine /v2/sandbox/apps/
öğesine istek yapın.
https://actions.googleapis.com/v2/sandbox/apps/PROJECT_ID/entities:batchPush
https://actions.googleapis.com/v2/sandbox/apps/PROJECT_ID/entities/TYPE/ENTITY_ID?entity.vertical=FOODORDERING&delete_time=DELETE_TIME
Varlıklar güncelleniyor
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 istek parametrelerini içermelidir.
Yükü güncelleyin
JSON, aşağıdaki farklar dışında toplu feed'de olduğu gibi görünü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.
- Zarf aşağıdaki gibidir:
{ "requests": [ { "entity": { "data":"ENTITY_DATA", "name": "apps/project_id>/entities/type/entity_id" }, "update_time":"UPDATE_TIMESTAMP" }, ], "vertical": "FOODORDERING" }
Yukarıdaki yükte aşağıdakileri değiştirin:
- ENTITY_DATA: JSON biçiminde, dize olarak serileştirilmiş varlık. JSON-LD varlığı,
data
alanında bir dize olarak iletilmelidir. - UPDATE_TIMESTAMP (isteğe bağlı): Sistemlerinizde varlığın güncellendiği zaman damgası. Zaman değeri gelecekte olmamalıdır. Varsayılan zaman damgası, Google'ın isteği aldığı zamandır. Artımlı bir istek aracılığıyla varlık gönderirken varlık sürümü oluşturma, ekleme/güncelleme isteğinde de
update_time
alanını kullanır.
Ö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ğıdaki gibi görünen bir toplu feed düşünün:
{ "@type": "Restaurant", "@id": "restaurant12345", "name": "Some Restaurant", "url": "https://www.provider.com/somerestaurant", "telephone": "+16501234567", "streetAddress": "345 Spear St", "addressLocality": "San Francisco", "addressRegion": "CA", "postalCode": "94105", "addressCountry": "US", "latitude": 37.472842, "longitude": -122.217144 }
Bu durumda HTTP POST ile artımlı güncellemeniz şöyle olur:
POST v2/sandbox/apps/provider-project/entities:batchPush Host: actions.googleapis.com Content-Type: application/ld+json { "requests": [ { "entity": { "name": "apps/provider-project/entities/restaurant/restaurant12345", "data": { "@type": "Restaurant", "@id": "restaurant12345", "name": "Some Restaurant", "url": "https://www.provider.com/somerestaurant", "telephone": "+16501235555", "streetAddress": "345 Spear St", "addressLocality": "San Francisco", "addressRegion": "CA", "postalCode": "94105", "addressCountry": "US", "latitude": 37.472842, "longitude": -122.217144 } } } "vertical": "FOODORDERING" }
2. Örnek: Birden fazla restoranı güncelleme
İki restoran varlığını tek bir API çağrısında güncellemek için HTTP POST isteği aşağıdaki gibi olur:
POST v2/sandbox/apps/provider-project/entities:batchPush Host: actions.googleapis.com Content-Type: application/ld+json { "requests": [ { "entity": { "name": "apps/provider-project/entities/restaurant/restaurant12345", "data": { "@type": "Restaurant", "@id": "restaurant12345", "name": "Some Restaurant", "url": "https://www.provider.com/somerestaurant", "telephone": "+16501235555", "streetAddress": "345 Spear St", "addressLocality": "San Francisco", "addressRegion": "CA", "postalCode": "94105", "addressCountry": "US", "latitude": 37.472842, "longitude": -122.217144 } } }, { "entity": { "name": "apps/provider-project/entities/restaurant/restaurant123", "data": { "@type": "Restaurant", "@id": "restaurant123", "name": "Some Other Restaurant", "url": "https://www.provider.com/somerestaurant", "telephone": "+16501231235", "streetAddress": "385 Spear St", "addressLocality": "San Mateo", "addressRegion": "CA", "postalCode": "94115", "addressCountry": "US" } } } ] "vertical": "FOODORDERING" }
3. Örnek: Menü öğesi fiyatını güncelleme
Menüdeki bir ürünün fiyatını değiştirmeniz gerektiğini varsayalım. 1. Örnek'te olduğu gibi, güncellemeniz üst düzey varlığın (menü) tamamı için JSON'u içermelidir ve feed, v1 envanter şemasını kullanır.
Aşağıdaki gibi görünen bir toplu feed düşünün:
{ "@type": "MenuItemOffer", "@id": "menuitemoffer6680262", "sku": "offer-cola", "menuItemId": "menuitem896532", "price": 3.00, "priceCurrency": "USD" }
Bu durumda POST aracılığıyla artımlı güncellemeniz aşağıdaki gibi olur:
POST v2/sandbox/apps/provider-project/entities:batchPush Host: actions.googleapis.com Content-Type: application/ld+json { "requests": [ { "entity": { "name": "apps/provider-project/entities/menuitemoffer/menuitemoffer6680262", "data": { "@type": "MenuItemOffer", "@id": "menuitemoffer6680262", "sku": "offer-cola", "menuItemId": "menuitem896532", "price": 1.00, "priceCurrency": "USD" }, "vertical": "FOODORDERING" } } ] "vertical": "FOODORDERING" }
Varlık ekleme
Varlık eklemek için envanter güncellemeleri kullanmaktan kaçının. Bunun yerine, v2 envanter şeması için açıklandığı şekilde toplu feed işlemini kullanın.
Varlık kaldırma
Üst düzey varlıkları kaldırmak için, hafif değiştirilmiş bir uç nokta kullanır ve istekte HTTP POST yerine HTTP DELETE kullanabilirsiniz.
Üst düzey öğeyi silme
Feed'deki bir restoranı silmek istediğiniz bir durumu düşünün. Hizmetlerini ve menülerini de silmeniz gerekir.
"Sağlayıcı/restoran/menü/nr" kimliğine sahip bir menü varlığı için örnek uç nokta:
DELETE v2/apps/delivery-provider-id/entities/menu/provider%2Frestaurant%2Fmenu%2Fnr?entity.vertical=FOODORDERING
Host: actions.googleapis.com
"https://www.provider.com/Restaurant/nr" kimliğine sahip bir restoran varlığı için örnek uç nokta:
DELETE v2/apps/delivery-provider-id/entities/restaurant/provider%2Frestaurant%2Fnr?entity.vertical=FOODORDERING
Host: actions.googleapis.com
"https://www.provider.com/Restaurant/service/nr" kimliğine sahip bir hizmet varlığı için örnek uç nokta:
DELETE v2/apps/delivery-provider-id/entities/service/provider%2Frestaurant%2Fservice%2Fnr?entity.vertical=FOODORDERING
Host: actions.googleapis.com
}
Alt varlıkları kaldırma
Üst düzey varlık içindeki bir alt varlığı (ör. menü içindeki bir menü öğesi) kaldırmak için HTTP DELETE'i kullanmayın. Bunun yerine, alt öğelerin kaldırılmasını, ilgili listeden veya reverseReference'dan kaldırıldığı üst düzey bir varlık için yapılan bir güncelleme olarak ele alın.
API yanıt kodları
Başarılı bir çağrı, feed'in geçerli veya doğru olduğu değil, yalnızca API çağrısının yapıldığı anlamına gelir. Başarılı çağrılar, boş bir yanıt gövdesiyle birlikte bir HTTP yanıt kodu 200 alır:
{}
Hatalar için HTTP yanıt kodu 200 olmaz ve yanıt gövdesinde neyin yanlış olduğu belirtilir.
Örneğin, kullanıcı zarftaki "vertical" değerini FAKE_VERTICAL
olarak ayarladıysa aşağıdaki mesajı alırsınız:
{
"error": {
"code": 400,
"message": "Invalid value at 'entity.vertical' (TYPE_ENUM), \"FAKE_VERTICAL\"",
"status": "INVALID_ARGUMENT",
"details": [
{
"@type": "type.googleapis.com/google.rpc.BadRequest",
"fieldViolations": [
{
"field": "entity.vertical",
"description": "Invalid value at 'entity.vertical' (TYPE_ENUM), \"FAKE_VERTICAL\""
}
]
}
]
}
}
Kod örneği
Aşağıda, Incremental Update API'nin çeşitli dillerde nasıl kullanılacağına dair bazı örnekler verilmiştir. Bu örneklerde Google Kimlik Doğrulama Kitaplıkları kullanılır ve v1 envanter şemasını kullanan bir feed varsayılır. Alternatif çözümler için Sunucudan Sunucuya Uygulamalar için OAuth 2.0'ı Kullanma sayfasına bakın.
Varlıklar güncelleniyor
Node.js
Bu kod, Node.js için Google kimlik doğrulama kitaplığını kullanır.
const {auth} = require('google-auth-library') const request = require('request'); // The service account client secret file downloaded from the Google Cloud Console const serviceAccountJson = require('./service-account.json') // entity.json is a file that contains the entity data in json format const entity = require('./entity.json') const ENTITY_ID = 'your/entity/id' const PROJECT_ID = 'type/your-project-id' /** * Get the authorization token using a service account. */ async function getAuthToken() { let client = auth.fromJSON(serviceAccountJson) client.scopes = ['https://www.googleapis.com/auth/assistant'] const tokens = await client.authorize() return tokens.access_token; } /** * Send an incremental update to update or add an entity */ async function updateEntity(entity) { const token = await getAuthToken() request.post({ headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, url: `https://actions.googleapis.com/v2/apps/${PROJECT_ID}/entities:batchPush`, body: { requests: [ { entity: { data: JSON.stringify(entity) name: `apps/${PROJECT_ID}/entities/${ENTITY_ID}` } } ], vertical: 'FOODORDERING' }, json: true }, (err, res, body) => { if (err) { return console.log(err); } console.log(`Response: ${JSON.stringify(res)}`) }) } updateEntity(entity)
Python
Bu kod, Python için Google kimlik doğrulama kitaplığını kullanır.
from google.oauth2 import service_account from google.auth.transport.requests import AuthorizedSession import json import urllib PROJECT_ID = 'your-project-id' ENTITY_ID = 'type/your/entity/id' ENDPOINT = 'https://actions.googleapis.com/v2/apps/%s/entities:batchPush' % ( PROJECT_ID) # service-account.json is the service account client secret file downloaded from the # Google Cloud Console credentials = service_account.Credentials.from_service_account_file( 'service-account.json') scoped_credentials = credentials.with_scopes( ['https://www.googleapis.com/auth/assistant']) authed_session = AuthorizedSession(scoped_credentials) # Retrieving the entity update_file = open("entity.json") #JSON file containing entity data in json format. data = update_file.read() entity = {} entity['data'] = data #entity JSON-LD serialized as string entity['name'] = 'apps/%s/entities/%s' % (PROJECT_ID, urllib.quote(ENTITY_ID, '') ) # Populating the request request = {} request['entity'] = entity requestArray = [request] # Populating the payload payload = {} payload['requests'] = requestArray payload['vertical'] = 'FOODORDERING' response = authed_session.post(ENDPOINT, json=payload) print(response.text) #if successful, will be '{}'
Java
Bu kod, Java için Google kimlik doğrulama kitaplığını kullanır.
private static final String PROJECT_ID = "your-project-id"; private static final String ENTITY_ID = "type/your-entity-id"; /** * Get the authorization token using a service account. */ private static String getAuthToken() { InputStream serviceAccountFile = Example.class.getClassLoader().getResourceAsStream("service-account.json"); ServiceAccountCredentials.Builder credentialsSimpleBuilder = ServiceAccountCredentials.fromStream(serviceAccountFile).toBuilder(); credentialsSimpleBuilder.setScopes(ImmutableList.of("https://www.googleapis.com/auth/assistant")); AccessToken accessToken = credentialsSimpleBuilder.build().refreshAccessToken(); return accessToken.getTokenValue(); } /** * Send an incremental update to update or add an entity. * @param entityId The id of the entity to update. * @param entity the json of the entity to be updated. */ public void updateEntity(String entityId, JSONObject data) { String authToken = getAuthToken(); String endpoint = String.format("https://actions.googleapis.com/v2/apps/%s/entities/:batchPush", PROJECT_ID); JSONObject entity = new JSONObject(); entity.put("data", data.toString()); entity.put("name", String.format("apps/%s/entities/%s", PROJECT_ID, URLEncoder.encode(ENTITY_ID, "UTF-8"))); JSONObject request = new JSONObject(); request.put("entity", entity); JSONArray requestArray = new JSONArray(); requestArray.put(request); JSONObject payload = new JSONObject(); payload.put("requests", requestArray); payload.put("vertical", FOODORDERING); // Execute POST request executePostRequest(endpoint, authToken, payload); }
Varlıkları kaldırma
Node.js
Bu kod, Node.js için Google kimlik doğrulama kitaplığını kullanır.
const {auth} = require('google-auth-library') const request = require('request'); // The service account client secret file downloaded from the Google Cloud Console const serviceAccountJson = require('./service-account.json') // entity.json is a file that contains the entity data in json format const entity = require('./entity.json') const ENTITY_ID = 'restaurant/http://www.provider.com/somerestaurant' const PROJECT_ID = 'your-project-id' /** * Get the authorization token using a service account. */ async function getAuthToken() { let client = auth.fromJSON(serviceAccountJson) client.scopes = ['https://www.googleapis.com/auth/assistant'] const tokens = await client.authorize() return tokens.access_token; } /** * Send an incremental update to delete an entity */ async function deleteEntity(entityId) { const token = await getAuthToken() request.delete({ headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, url: `https://actions.googleapis.com/v2/apps/${PROJECT_ID}/entities/${encodeURIComponent(entityId)}?entity.vertical=FOODORDERING`, body: {}, json: true }, (err, res, body) => { if (err) { return console.log(err); } console.log(`Response: ${JSON.stringify(res)}`) }) } deleteEntity(ENTITY_ID)
Python
Bu kod, Python için Google kimlik doğrulama kitaplığını kullanır.
from google.oauth2 import service_account from google.auth.transport.requests import AuthorizedSession import json import urllib # Service config PROJECT_ID = 'your-project-id' ENTITY_ID = 'restaurant/http://www.provider.com/somerestaurant' DELETE_TIME = '2018-04-07T14:30:00-07:00' ENDPOINT = 'https://actions.googleapis.com/v2/apps/%s/entities/%s?entity.vertical=FOODORDERING&delete_time=%s' % ( PROJECT_ID, urllib.quote(ENTITY_ID, ''), urllib.quote(DELETE_TIME, '')) # service-account.json is the service account client secret file downloaded from the # Google Cloud Console credentials = service_account.Credentials.from_service_account_file( 'service-account.json') scoped_credentials = credentials.with_scopes( ['https://www.googleapis.com/auth/assistant']) authed_session = AuthorizedSession(scoped_credentials) response = authed_session.delete(ENDPOINT) print(response.text) #if successful, will be '{}'
Java
Bu kod, Java için Google kimlik doğrulama kitaplığını kullanır.
private static final String PROJECT_ID = "your-project-id"; private static final String ENTITY_ID = "restaurant/http://www.provider.com/somerestaurant"; /** * Get the authorization token using a service account. */ private static String getAuthToken() { InputStream serviceAccountFile = Example.class.getClassLoader().getResourceAsStream("service-account.json"); ServiceAccountCredentials.Builder credentialsSimpleBuilder = ServiceAccountCredentials.fromStream(serviceAccountFile).toBuilder(); credentialsSimpleBuilder.setScopes(ImmutableList.of("https://www.googleapis.com/auth/assistant")); AccessToken accessToken = credentialsSimpleBuilder.build().refreshAccessToken(); return accessToken.getTokenValue(); } /** * Send an incremental update to delete an entity. * @param entityId The id of the entity to delete. */ public void deleteEntity(String entityId) { String authToken = getAuthToken(); String endpoint = String.format( "https://actions.googleapis.com/v2/apps/%s/entities/%s?entity.vertical=FOODORDERING", PROJECT_ID, URLEncoder.encode(entityId, "UTF-8")); // Execute DELETE request System.out.println(executeDeleteRequest(endpoint, authToken)); }
Kullanım alanları
Aşağıdaki kullanım alanları; artımlı güncellemeler, tam 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. Ek 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 |
Ek güncellemeler: Kapsayıcı MenuItemOffer varlığını, belirtilen MenuItem için inventoryLevel değeri 0 olarak ayarlanmış şekilde, diğer tüm verileri değiştirmeden gönderin. |
Menü öğesi fiyat değişikliği | MenuItemOffer |
Artımlı güncellemeler: price içeren kapsayıcı MenuItemOffer varlığını, belirtilen MenuItem için güncellenmiş fiyata ayarlayın ve diğer tüm verileri 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 |
Ek 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 |
Ek feed'ler: Söz konusu ServiceArea varlığını tüm alanları (normalde tam feed'lerde yaptığınız gibi) korunarak 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 |
Ek feed'ler: ServiceHours öğesini, feed'lerdekiyle aynı şekilde gönderin ancak leadTimeMin buna uygun şekilde güncellenir. |
Service ayındaki teslimat fiyatlarını güncelle |
Fee |
Ek feed'ler: price güncellenmiş olarak Fee tam yayını gönderin. |
Service konumunda teslimat veya paket servisi saatlerini güncelleyin |
ServiceHours |
Ek 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 |
Ek feed'ler: Fee adlı paketin tamamını (minPrice ) güncellenmiş olarak gönder |
MenuItem öğesini kalıcı olarak silme |
Menu |
Ek feed'ler: MenuItem öğesini, feed'lerdekiyle aynı şekilde gönderin, ancak parentMenuSectionId alanını boş bırakın.
|
Toplu işler ve artımlı güncellemeler için işleme süresiyle ilgili hizmet düzeyi hedefi
Bir toplu işlem aracılığıyla güncellenen veya silinen bir varlık 2 saat içinde en iyi çaba modunda işlenir. Artımlı güncellemeyle güncellenen bir varlık ise 5 dakika içinde işlenir. Eski bir varlık 7 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
- Günde bir toplu iş ve envanterinizi güncel tutmak için Artımlı API'ler.