Giriş
El değmeden kayıt API'si, cihaz bayilerinin entegrasyonlarını otomatikleştirmelerine yardımcı olur. Kuruluşunuzun satış araçları, kullanıcılarınızı ve müşterilerinizi daha üretken hale getirecek şekilde sıfır dokunuşla kaydolma özelliğini içerebilir. API'yi kullanarak kullanıcılarınıza yardımcı olabilirsiniz:
- Satın alınan cihazları müşterinin el değmeden kayıt hesabına atayın.
- Müşterinizin el değmeden kayıt hesabını oluşturun.
- Kuruluşunuzun telefon numarasını ekleyin ve cihazlara meta veri siparişi verin.
- Müşterilerinize atanan cihazlar hakkında raporlar oluşturun.
Bu belgede API tanıtılmakta ve kalıplar açıklanmaktadır. Şunu istiyorsanız: öğrenmek için aşağıdaki hızlı başlangıç kılavuzunu deneyin: Java, .NET veya Python.
API kavramları
Müşteriler ve cihazlar, API'de kullandığınız temel kaynaklardır. Müşteri oluşturmak için create
numaralı telefonu arayın. Cihazlar oluşturabilirsiniz
Hak talebi API'si yöntemlerini kullanarak (aşağıya göz atın). Kuruluşunuz, el değmeden kayıt portalını kullanarak müşteri ve cihaz da oluşturabilir.
- Müşteri
- Kuruluşunuzun cihaz sattığı şirketler. Müşterilerin
name
hakkı var veID
. Bir müşterinin cihazı için hak talebinde bulunmak veya cihazı bulmak istediğinizde müşteriyi kullanın. Alıcı: Daha fazla bilgi için bkz.Customer
. - Cihaz
- Kuruluşunuzun el değmeden kayıt özellikli Android veya ChromeOS cihazı
bir satış sürecidir. Cihazlarda donanım kimlikleri, meta veriler ve müşteri hak talepleri bulunur. Cihazlar API'nin merkezinde olduğu için bunları neredeyse
yöntemlerine göz atın. Daha fazla bilgi için
Device
sayfasına bakın. - DeviceIdentifier
- Üretilmiş bir cihazı tanımlamak için IMEI veya MEID gibi donanım kimliklerini içerir
olanak tanır. Bulmak, güncellemek veya hak talebinde bulunmak istediğiniz cihazı hedeflemek için
DeviceIdentifier
kullanın. Daha fazla bilgi edinmek için Tanımlayıcılar. - DeviceMetadata
- Cihazın anahtar/değer çifti meta verilerini depolar. Tekliflerinizi otomatikleştirmek ve optimize etmek için
Kuruluşunuzun meta verilerini depolamak için
DeviceMetadata
. Alıcı: Daha fazla bilgi için Cihaz meta verileri bölümünü okuyun.
Uygulamanızın kullanabileceği tüm API yöntemlerini ve kaynaklarını listelemek için API Referansı'na bakın.
Müşteri oluşturma
Android cihazlarda, müşteri adına müşteri hesabını oluşturmaktan bayi sorumludur. Müşteri, cihazlarının temel hazırlama ayarlarını yapılandırmak için el değmeden kayıt portalına erişmek üzere bu hesabı kullanır. Bu işlem, halihazırda Google'a sahip olan ChromeOS cihazlar için gerekli değildir Temel hazırlık ayarlarını yapılandırmak için kullanacakları Workspace hesabı.
El değmeden kayıt için müşteri hesapları oluşturmak üzere create
API yöntemini çağırabilirsiniz. Müşterileriniz, el değmeden kayıt portallarında şirket adını gördüğünden uygulamanızın kullanıcısı bu adın doğru olduğunu onaylamalıdır. Bir müşterinin adını,
bir fırsattır.
Google Hesabı'na sahip olmanız gerekir. API ile kişisel Gmail hesaplarını kullanamazsınız. Müşterinin hesabı ilişkilendirme konusunda yardıma ihtiyacı olursa talimatların kaynağı Google Hesabı ilişkilendirin.
API'yi çağırarak bir müşteri oluşturduktan sonra, müşteriler kendi çalışanlarının portal erişimini yönetir. Müşterilerinizin kullanıcılarını API'yi kullanarak düzenleyemezsiniz. Aşağıdaki snippet'te, müşterinin nasıl oluşturulabileceği gösterilmektedir:
Java
// Provide the customer data as a Company type. // The API requires a name and owners. Company customer = new Company(); customer.setCompanyName("XYZ Corp"); customer.setOwnerEmails(Arrays.asList("liz@example.com", "darcy@example.com")); customer.setAdminEmails(Collections.singletonList("jane@example.com")); // Use our reseller ID for the parent resource name. String parentResource = String.format("partners/%d", PARTNER_ID); // Call the API to create the customer using the values in the company object. CreateCustomerRequest body = new CreateCustomerRequest(); body.setCustomer(customer); Company response = service.partners().customers().create(parentResource, body).execute();
.NET
// Provide the customer data as a Company type. // The API requires a name and owners. var customer = new Company { CompanyName = "XYZ Corp", OwnerEmails = new String[] { "liz@example.com", "darcy@example.com" }, AdminEmails = new String[] { "jane@example.com" } }; // Use our reseller ID for the parent resource name. var parentResource = String.Format("partners/{0}", PartnerId); // Call the API to create the customer using the values in the company object. var body = new CreateCustomerRequest { Customer = customer }; var request = service.Partners.Customers.Create(body, parentResource); var response = request.Execute();
Python
# Provide the customer data as a Company type. The API requires # a name and at least one owner. company = {'companyName':'XYZ Corp', \ 'ownerEmails':['liz@example.com', 'darcy@example.com'], \ 'adminEmails':['jane@example.com']} # Use our reseller ID for the parent resource name. parent_resource = 'partners/{0}'.format(PARTNER_ID) # Call the API to create the customer using the values in the company object. response = service.partners().customers().create(parent=parent_resource, body={'customer':company}).execute()
Müşterinizin çalışanlarına ilişkin sahip ve yönetici rolleri hakkında daha fazla bilgi edinmek için: Portal kullanıcıları'nı okuyun.
Müşteriler için cihazlar talep edin
Cihaz satın alan müşterileriniz temel hazırlığı yapılandırmak isterler. bu cihazlara ait ayarları belirleyebilir. Bir cihaz için hak talebinde bulunmak, cihazı el değmeden kayıt işlemine ekler ve müşteriye temel hazırlama ayarlarını yapılandırma olanağı tanır.
Cihazın temel hazırlığı kaydında el değmeden kayıt için bir bölüm bulunur. Siz
kaydın el değmeden kayıt bölümünü talep ederek cihazı atayın.
bir fırsattır. Müşteri bağımsız değişkeni olarak partners.devices.claim
veya partners.devices.claimAsync
yöntemlerini çağırın. SECTION_TYPE_ZERO_TOUCH
değerini her zaman için
sectionType
.
Bu işlem için önce bir müşterinin cihazıyla ilgili hak talebini iptal etmeniz (aşağıya bakın) gerekir
farklı bir müşteri için aynı cihazı talep etme. Hak talebi yöntemleri
DeviceIdentifier
alanlarını doğrular,
IMEI veya MEID ya da seri numarası gibi
üreticinin adı ile modeli ve
ChromeOS cihazlar için onaylanmış cihaz kimliğini (yeni cihaz oluştururken) kullanın.
Aşağıdaki snippet'te bir cihaz için nasıl hak talebinde bulunulacağı gösterilmektedir:
Java
// Identify the device to claim. DeviceIdentifier identifier = new DeviceIdentifier(); // The manufacturer value is optional but recommended for cellular devices identifier.setManufacturer("Google"); identifier.setImei("098765432109875"); // Create the body to connect the customer with the device. ClaimDeviceRequest body = new ClaimDeviceRequest(); body.setDeviceIdentifier(identifier); body.setCustomerId(customerId); body.setSectionType("SECTION_TYPE_ZERO_TOUCH"); // Claim the device. ClaimDeviceResponse response = service.partners().devices().claim(PARTNER_ID, body).execute();
.NET
// Identify the device to claim. var deviceIdentifier = new DeviceIdentifier { // The manufacturer value is optional but recommended for cellular devices Manufacturer = "Google", Imei = "098765432109875" }; // Create the body to connect the customer with the device. ClaimDeviceRequest body = new ClaimDeviceRequest { DeviceIdentifier = deviceIdentifier, CustomerId = CustomerId, SectionType = "SECTION_TYPE_ZERO_TOUCH" }; // Claim the device. var response = service.Partners.Devices.Claim(body, PartnerId).Execute();
Python
# Identify the device to claim. # The manufacturer value is optional but recommended for cellular devices device_identifier = {'manufacturer':'Google', 'imei':'098765432109875'} # Create the body to connect the customer with the device. request_body = {'deviceIdentifier':device_identifier, \ 'customerId':customer_id, \ 'sectionType':'SECTION_TYPE_ZERO_TOUCH'} # Claim the device. response = service.partners().devices().claim(partnerId=PARTNER_ID, body=request_body).execute()
Cihazlar üzerinde hak talebini iptal etme
Kuruluşunuz, bir müşteriden cihaz hak talebini iptal edebilir. Cihaz hak talebini iptal etme
el değmeden kayıttan kaldırır. Bayi, aşağıdaki koşulları karşılayan bir cihaz için hak talebini iptal edebilir:
başka bir hesaba taşınmasını, iade edilmesini veya yanlışlıkla hak talebinde bulunulmasını istiyorlar.
partners.devices.unclaim
yöntemini çağırın veya
Şu hak talebini iptal etmek için partners.devices.unclaimAsync
:
müşteriden alınan bir üründür.
Satıcılar
Bayi ağınızdaki bayi iş ortaklarını, küresel bir bayi ağındaki yerel operatörleri veya sizin adınıza cihaz satan herhangi bir kuruluşu temsil etmek için tedarikçi firmaları kullanabilirsiniz. Tedarikçi firmalar, kullanıcılarınızı, müşterilerinizi ve cihazlarınızı ayırmanıza yardımcı olur:
- Oluşturduğunuz tedarikçiler, el değmeden kayıt hesabınızı veya birbirlerinin hesaplarını göremez.
- Tedarikçilerinizin müşterilerini ve cihazlarını görüntüleyebilir, tedarikçi firmaların cihazlarının kaydını iptal edebilirsiniz. Ancak tedarikçilerinizin müşterilerine cihaz atayamazsınız.
Kuruluşunuz için tedarikçi firma oluşturmak amacıyla portalı kullanın. API'yi kullanamazsınız. Hesap rolünüz:
Sahip'i tıklayın. Kuruluşunuzda tedarikçiler varsa
partners.vendors.list
numaralı telefonu arayarak
tedarikçi firmalar ve partners.vendors.customers.list
edinmek önemlidir. Aşağıdaki örnekte, tedarikçi firmaların müşterilerinin Hizmet Şartları durumunu gösteren bir rapor yazdırmak için bu yöntemlerin her ikisi de kullanılmaktadır:
Java
// First, get the organization's vendors. String parentResource = String.format("partners/%d", PARTNER_ID); ListVendorsResponse results = service.partners().vendors().list(parentResource).execute(); if (results.getVendors() == null) { return; } // For each vendor, report the company name and a maximum 5 customers. for (Company vendor: results.getVendors()) { System.out.format("\n%s customers\n", vendor.getCompanyName()); System.out.println("---"); // Use the vendor's API resource name as the parent resource. AndroidProvisioningPartner.Partners.Vendors.Customers.List customerRequest = service.partners().vendors().customers().list(vendor.getName()); customerRequest.setPageSize(5); ListVendorCustomersResponse customerResponse = customerRequest.execute(); List<Company> customers = customerResponse.getCustomers(); if (customers == null) { System.out.println("No customers"); break; } else { for (Company customer: customers) { System.out.format("%s: %s\n", customer.getCompanyName(), customer.getTermsStatus()); } } }
.NET
// First, get the organization's vendors. var parentResource = String.Format("partners/{0}", PartnerId); var results = service.Partners.Vendors.List(parentResource).Execute(); if (results.Vendors == null) { return; } // For each vendor, report the company name and a maximum 5 customers. foreach (Company vendor in results.Vendors) { Console.WriteLine("\n{0} customers", vendor); Console.WriteLine("---"); // Use the vendor's API resource name as the parent resource. PartnersResource.VendorsResource.CustomersResource.ListRequest customerRequest = service.Partners.Vendors.Customers.List(vendor.Name); customerRequest.PageSize = 5; var customerResponse = customerRequest.Execute(); IList<Company> customers = customerResponse.Customers; if (customers == null) { Console.WriteLine("No customers"); break; } else { foreach (Company customer in customers) { Console.WriteLine("{0}: {1}", customer.Name, customer.TermsStatus); } } }
Python
# First, get the organization's vendors. parent_resource = 'partners/{0}'.format(PARTNER_ID) vendor_response = service.partners().vendors().list( parent=parent_resource).execute() if 'vendors' not in vendor_response: return # For each vendor, report the company name and a maximum 5 customers. for vendor in vendor_response['vendors']: print '\n{0} customers'.format(vendor['companyName']) print '---' # Use the vendor's API resource name as the parent resource. customer_response = service.partners().vendors().customers().list( parent=vendor['name'], pageSize=5).execute() if 'customers' not in customer_response: print 'No customers' break for customer in customer_response['customers']: print ' {0}: {1}'.format(customer['name'], customer['termsStatus'])
Bir cihaz koleksiyonunuz varsa hangi bayi veya
satıcı cihaz için hak talebinde bulundu. Sayısal bayi kimliğini almak için
cihazın hak talebi kaydındaki resellerId
alanı.
Kuruluşunuz, satıcı tarafından talep edilen bir cihaz için hak talebini iptal edebilir. Şu özelliklere sahip diğer API çağrıları: Cihazları değiştiriyorsanız kuruluşunuzun cihazla ilgili hak talebinde bulunup bulunmadığını kontrol etmeniz gerekir . Aşağıdaki örnekte bunu nasıl yapabileceğiniz gösterilmektedir:
Java
// Get the devices claimed for two customers: one of our organization's // customers and one of our vendor's customers. FindDevicesByOwnerRequest body = new FindDevicesByOwnerRequest(); body.setSectionType("SECTION_TYPE_ZERO_TOUCH"); body.setCustomerId(Arrays.asList(resellerCustomerId, vendorCustomerId)); body.setLimit(MAX_PAGE_SIZE); FindDevicesByOwnerResponse response = service.partners().devices().findByOwner(PARTNER_ID, body).execute(); if (response.getDevices() == null) { return; } for (Device device: response.getDevices()) { // Confirm the device was claimed by our reseller and not a vendor before // updating metadata in another method. for (DeviceClaim claim: device.getClaims()) { if (claim.getResellerId() == PARTNER_ID) { updateDeviceMetadata(device.getDeviceId()); break; } } }
.NET
// Get the devices claimed for two customers: one of our organization's // customers and one of our vendor's customers. FindDevicesByOwnerRequest body = new FindDevicesByOwnerRequest { Limit = MaxPageSize, SectionType = "SECTION_TYPE_ZERO_TOUCH", CustomerId = new List<long?> { resellerCustomerId, vendorCustomerId } }; var response = service.Partners.Devices.FindByOwner(body, PartnerId).Execute(); if (response.Devices == null) { return; } foreach (Device device in response.Devices) { // Confirm the device was claimed by our reseller and not a vendor before // updating metadata in another method. foreach (DeviceClaim claim in device.Claims) { if (claim.ResellerId == PartnerId) { UpdateDeviceMetadata(device.DeviceId); break; } } }
Python
# Get the devices claimed for two customers: one of our organization's # customers and one of our vendor's customers. request_body = {'limit':MAX_PAGE_SIZE, \ 'pageToken':None, \ 'customerId':[reseller_customer_id, vendor_customer_id], \ 'sectionType':'SECTION_TYPE_ZERO_TOUCH'} response = service.partners().devices().findByOwner(partnerId=PARTNER_ID, body=request_body).execute() for device in response['devices']: # Confirm the device was claimed by our reseller and not a vendor before # updating metadata in another method. for claim in device['claims']: if claim['resellerId'] == PARTNER_ID: update_device_metadata(device['deviceId']) break
Uzun süreli toplu işlemler
API, cihaz yöntemlerinin eşzamansız sürümlerini içerir.
Bu yöntemler birçok cihazın toplu olarak işlenmesine olanak tanırken eşzamanlı
Yöntemler, her API isteği için bir cihaz işler. Eşzamansız yöntem adlarında Async son eki bulunur (ör. claimAsync
).
Eşzamansız API yöntemleri, işlem tamamlanmadan önce sonuç döndürür. Eşzamansız yöntemler, uygulamanızın (veya aracınızın) uzun süreli bir işlemin tamamlanmasını beklerken belirli kullanıcılara Uygulamanız, işlemin durumunu düzenli olarak kontrol etmelidir.
İşlemler
Uzun süren bir toplu işlemi izlemek için Operation
kullanırsınız. CEVAP
eşzamansız bir yönteme yapılan başarılı çağrı, işleme bir referans döndürür
kullanıcı olabilir. Aşağıdaki JSON snippet'inde, updateMetadataAsync
çağrıldıktan sonra tipik bir yanıt gösterilmektedir:
{
"name": "operations/apibatchoperation/1234567890123476789"
}
Her işlem, bağımsız görevlerin listesini içerir. İşlemdeki görevlerin durumu ve sonuçları hakkında bilgi edinmek için operations.get
numaralı hattı arayın. Aşağıdaki snippet,
bunu yapabilir. Kendi uygulamanızdaki hataları düzeltmeniz gerekir.
Java
// Build out the request body to apply the same order number to a customer's // purchase of 2 devices. UpdateMetadataArguments firstUpdate = new UpdateMetadataArguments(); firstUpdate.setDeviceMetadata(metadata); firstUpdate.setDeviceId(firstTargetDeviceId); UpdateMetadataArguments secondUpdate = new UpdateMetadataArguments(); secondUpdate.setDeviceMetadata(metadata); secondUpdate.setDeviceId(firstTargetDeviceId); // Start the device metadata update. UpdateDeviceMetadataInBatchRequest body = new UpdateDeviceMetadataInBatchRequest(); body.setUpdates(Arrays.asList(firstUpdate, secondUpdate)); Operation response = service .partners() .devices() .updateMetadataAsync(PARTNER_ID, body) .execute(); // Assume the metadata update started, so get the Operation for the update. Operation operation = service.operations().get(response.getName()).execute();
.NET
// Build out the request body to apply the same order number to a customer's // purchase of 2 devices. var updates = new List<UpdateMetadataArguments> { new UpdateMetadataArguments { DeviceMetadata = metadata, DeviceId = firstTargetDeviceId }, new UpdateMetadataArguments { DeviceMetadata = metadata, DeviceId = secondTargetDeviceId } }; // Start the device metadata update. UpdateDeviceMetadataInBatchRequest body = new UpdateDeviceMetadataInBatchRequest { Updates = updates }; var response = service.Partners.Devices.UpdateMetadataAsync(body, PartnerId).Execute(); // Assume the metadata update started, so get the Operation for the update. Operation operation = service.Operations.Get(response.Name).Execute();
Python
# Build out the request body to apply the same order number to a customer's # purchase of 2 devices. updates = [{'deviceMetadata':metadata,'deviceId':first_target_device_id}, {'deviceMetadata':metadata,'deviceId':second_target_device_id}] # Start the device metadata update. response = service.partners().devices().updateMetadataAsync( partnerId=PARTNER_ID, body={'updates':updates}).execute() # Assume the metadata update started, so get the Operation for the update. operation = service.operations().get(name=response['name']).execute()
Bir işlemin tamamlanıp tamamlanmadığını öğrenmek için işlemin true
değerine sahip bir done
alanı içerip içermediğini kontrol edin. done
eksikse veya false
ise işlem devam ediyor demektir.
Yanıtlar
Bir işlem tamamlandıktan sonra API, işlemi sonuçla (hatta
başarılı olup olmadığını
takip edebilirsiniz. response
alanı bir
DevicesLongRunningOperationResponse
işlemdeki her cihazın işlenmesini ayrıntılarıyla gösteren nesne
Herhangi bir görevin başarısız olup olmadığını etkili bir şekilde öğrenmek için successCount
alanını inceleyin ve
ve büyük sonuç listelerinde yineleme yapmaktan kaçının. perDeviceStatus
alanı
DevicesLongRunningOperationResponse
, şunların listesidir:
Her cihazı ayrıntılı bir şekilde belirten OperationPerDevice
örnek
gerekir. Liste sırası, orijinal istekteki görevlerle eşleşir.
Her OperationPerDevice
görevi, bir result
alanı ve bir hatırlatıcı özeti içerir
genel bir görünümünü sunar. result
alanını kullanarak görevin başarılı olup olmadığını kontrol edin.
Aşağıdaki JSON snippet'i,
updateMetadataAsync
için bir arama:
"response": {
"perDeviceStatus": [
{
"result": {
"deviceId": "12345678901234567",
"status": "SINGLE_DEVICE_STATUS_SUCCESS"
},
"updateMetadata": {
"deviceId": "12345678901234567",
"deviceMetadata": {
"entries": {
"phonenumber": "+1 (800) 555-0100"
}
}
}
}
],
"successCount": 1
}
İlerleme durumunu izleme
Uygulamanızın ilerlemeyi izlemesi gerekiyorsa işlemi düzenli olarak yeniden getirmeniz gerekir. metadata
alanı, uygulamanızın çalışan bir işlemin son ilerleme durumunu kontrol etmesine yardımcı olacak bir DevicesLongRunningOperationMetadata
örneği içerir. Tekliflerinizi otomatikleştirmek ve optimize etmek için
aşağıda listelenen DevicesLongRunningOperationMetadata
alanları
tablosunu kullanmanız gerekir:
Alan | Tipik kullanım |
---|---|
processingStatus
|
BATCH_PROCESS_PENDING olan değişiklikler
BATCH_PROCESS_IN_PROGRESS ve ardından
İşlem devam ederken BATCH_PROCESS_PROCESSED . |
progress
|
İşlenen güncellemelerin yüzdesi. Uygulamanız şunları kullanabilir:
bitiş zamanını tahmin
etmek için kullanabilirsiniz. İşlem tamamlanırken progress değeri 100 olabilir. Bu nedenle, işlemin tamamlanıp tamamlanmadığını ve bir sonucu olup olmadığını öğrenmek için işlemin done alanını kontrol edin. |
devicesCount
|
İşlemdeki güncelleme sayısını gösterir. API, güncellemelerin bazılarını ayrıştıramazsa bu sayı isteğinizde yer alan güncellemelerin sayısından farklı olabilir. |
Aşağıdaki basitleştirilmiş örnekte, bir uygulamanın aşağıdaki işlemler için ilerleme meta verilerini nasıl kullanabileceği gösterilmektedir: yoklama aralıkları ayarlayın. Uygulamanızda, anket için daha gelişmiş bir görev yürütücüye ihtiyacınız olabilir. Hata işlemeyi de eklemeniz gerekir.
Java
// Milliseconds between polling the API. private static long MIN_INTERVAL = 2000; private static long MAX_INTERVAL = 10000; // ... // Start the device metadata update. Operation response = service .partners() .devices() .updateMetadataAsync(PARTNER_ID, body) .execute(); String operationName = response.getName(); // Start polling for completion. long startTime = new Date().getTime(); while (true) { // Get the latest update on the operation's progress using the API. Operation operation = service.operations().get(operationName).execute(); if (operation.get("done") != null && operation.getDone()) { // The operation is finished. Print the status. System.out.format("Operation complete: %s of %s successful device updates\n", operation.getResponse().get("successCount"), operation.getMetadata().get("devicesCount")); break; } else { // Estimate how long the operation *should* take - within min and max value. BigDecimal opProgress = (BigDecimal) operation.getMetadata().get("progress"); double progress = opProgress.longValue(); long interval = MAX_INTERVAL; if (progress > 0) { interval = (long) ((new Date().getTime() - startTime) * ((100.0 - progress) / progress)); } interval = Math.max(MIN_INTERVAL, Math.min(interval, MAX_INTERVAL)); // Sleep until the operation should be complete. Thread.sleep(interval); } }
.NET
// Milliseconds between polling the API. private static double MinInterval = 2000; private static double MaxInterval = 10000; // ... // Start the device metadata update. var response = service.Partners.Devices.UpdateMetadataAsync(body, PartnerId).Execute(); var operationName = response.Name; // Start polling for completion. var startTime = DateTime.Now; while (true) { // Get the latest update on the operation's progress using the API. Operation operation = service.Operations.Get(operationName).Execute(); if (operation.Done == true) { // The operation is finished. Print the status. Console.WriteLine("Operation complete: {0} of {1} successful device updates", operation.Response["successCount"], operation.Metadata["devicesCount"]); break; } else { // Estimate how long the operation *should* take - within min and max value. double progress = (double)(long)operation.Metadata["progress"]; double interval = MaxInterval; if (progress > 0) { interval = DateTime.Now.Subtract(startTime).TotalMilliseconds * ((100.0 - progress) / progress); } interval = Math.Max(MinInterval, Math.Min(interval, MaxInterval)); // Sleep until the operation should be complete. System.Threading.Thread.Sleep((int)interval); } }
Python
# Seconds between polling the API. MIN_INTERVAL = 2; MAX_INTERVAL = 10; # ... # Start the device metadata update response = service.partners().devices().updateMetadataAsync( partnerId=PARTNER_ID, body={'updates':updates}).execute() op_name = response['name'] start_time = time.time() # Start polling for completion while True: # Get the latest update on the operation's progress using the API op = service.operations().get(name=op_name).execute() if 'done' in op and op['done']: # The operation is finished. Print the status. print('Operation complete: {0} of {1} successful device updates'.format( op['response']['successCount'], op['metadata']['devicesCount'] )) break else: # Estimate how long the operation *should* take - within min and max. progress = op['metadata']['progress'] interval = MIN_INTERVAL if progress > 0: interval = (time.time() - start_time) * ((100.0 - progress) / progress) interval = max(MIN_INTERVAL, min(interval, MAX_INTERVAL)) # Sleep until the operation should be complete. time.sleep(interval)
Uygulamanızın kullanıcılarına uygun bir anket yaklaşımı seçin. Bazı uygulama kullanıcıları, bir işlemin tamamlanmasını beklerken düzenli ilerleme güncellemelerinden yararlanabilir.
Sayfalandırılmış sonuçlar
partners.devices.findByOwner
API yöntemi
çok büyük cihaz listeleri döndürebilir. Yanıt boyutunu küçültmek için bu ve
diğer API yöntemleri (ör.
partners.devices.findByIdentifier
)
sayfalandırılmış sonuçları destekler. Sayfalandırılmış sonuçlar sayesinde uygulamanız, büyük listeleri birer sayfa halinde iteratif olarak isteyebilir ve işleyebilir.
API yöntemini çağırdıktan sonra, yanıtta nextPageToken
için bir değer olup olmadığını kontrol edin. Eğer nextPageToken
ise
null
değilse uygulamanız, şunu arayarak başka bir cihaz sayfasını getirmek için bunu kullanabilir:
yöntemi tekrarlamanız gerekir. Şuradaki cihaz sayısı için bir üst sınır belirlemeniz gerekir:
limit
parametresinden yararlanın. nextPageToken
null
ise uygulamanız son sayfayı istemiştir.
Aşağıdaki örnek yöntemde, uygulamanızın cihaz listesini bir sayfa halinde nasıl yazdırabileceği gösterilmektedir:
Java
private static long MAX_PAGE_SIZE = 10; // ... /** * Demonstrates how to loop through paginated lists of devices. * @param pageToken The token specifying which result page to return. * @throws IOException If the zero-touch API call fails. */ private void printDevices(String pageToken) throws IOException { // Create the request body to find the customer's devices. FindDevicesByOwnerRequest body = new FindDevicesByOwnerRequest(); body.setLimit(MAX_PAGE_SIZE); body.setSectionType("SECTION_TYPE_ZERO_TOUCH"); body.setCustomerId(Collections.singletonList(targetCustomerId)); // Call the API to get a page of Devices. Send a page token from the method // argument (might be None). If the page token is None, the API returns the first page. FindDevicesByOwnerResponse response = service.partners().devices().findByOwner(PARTNER_ID, body).execute(); if (response.getDevices() == null) { return; } // Print the devices included in this page of results. for (Device device: response.getDevices()) { System.out.format("Device %s\n", device.getName()); } System.out.println("---"); // Check to see if another page of devices is available. If yes, // fetch and print the devices. if (response.getNextPageToken() != null) { this.printDevices(response.getNextPageToken()); } } // ... // Pass null to start printing the first page of devices. printDevices(null);
.NET
private static int MaxPageSize = 10; // ... /// <summary>Demonstrates how to loop through paginated lists of devices.</summary> /// <param name="pageToken">The token specifying which result page to return.</param> private void PrintDevices(string pageToken) { // Create the request body to find the customer's devices. FindDevicesByOwnerRequest body = new FindDevicesByOwnerRequest { PageToken = pageToken, Limit = MaxPageSize, SectionType = "SECTION_TYPE_ZERO_TOUCH", CustomerId = new List<long?> { targetCustomerId } }; // Call the API to get a page of Devices. Send a page token from the method // argument (might be None). If the page token is None, the API returns the first page. var response = service.Partners.Devices.FindByOwner(body, PartnerId).Execute(); if (response.Devices == null) { return; } // Print the devices included in this page of results. foreach (Device device in response.Devices) { Console.WriteLine("Device: {0}", device.Name); } Console.WriteLine("---"); // Check to see if another page of devices is available. If yes, // fetch and print the devices. if (response.NextPageToken != null) { this.PrintDevices(response.NextPageToken); } } // ... // Pass null to start printing the first page of devices. PrintDevices(null);
Python
MAX_PAGE_SIZE = 10; # ... def print_devices(page_token): """Demonstrates how to loop through paginated lists of devices. Args: page_token: The token specifying which result page to return. """ # Create the body to find the customer's devices. request_body = {'limit':MAX_PAGE_SIZE, \ 'pageToken':page_token, \ 'customerId':[target_customer_id], \ 'sectionType':'SECTION_TYPE_ZERO_TOUCH'} # Call the API to get a page of Devices. Send a page token from the method # argument (might be None). If the page token is None, # the API returns the first page. response = service.partners().devices().findByOwner(partnerId=PARTNER_ID, body=request_body).execute() # Print the devices included in this page of results. for device in response['devices']: print 'Device: {0}'.format(device['name']) print '---' # Check to see if another page of devices is available. If yes, # fetch and print the devices. if 'nextPageToken' in response: print_devices(response['nextPageToken']) # ... # Pass None to start printing the first page of devices. print_devices(None);
Sonraki adımlar
Artık API'nin nasıl çalıştığını öğrendiğinize göre Java, .NET veya Python. API çağrısı örneklerini görüntülemek ve API'yi kendiniz çağırmayı denemek için colab kullanabilirsiniz.