İşleyiş şekli

Giriş

El değmeden kayıt API'si, cihaz bayilerinin entegrasyonlarını otomatikleştirmelerine yardımcı olur. Kuruluşunuzun satış araçları el değmeden kayıt özelliğine sahip olabilir. Böylece ve müşterilerinizi, daha verimli kılmanıza yardımcı olur. API'yi kullanarak kullanıcılarınıza aşağıdaki konularda yardımcı olun:

  • 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 ve sipariş meta verilerini cihazlara ekleyin.
  • 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. Oluşturmak için 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 ayrıca El değmeden kayıt portalını kullanarak müşteriler ve cihazlar oluşturabilirsiniz.

Cihaz ve müşteri kaynağı ilişkisi

Müşteri
Kuruluşunuzun cihaz sattığı şirketler. Müşterilerin name hakkı var ve ID. Bir müşterinin cihazı için hak talebinde bulunmak veya cihazı bulmak istediğinizde 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. Cihazların donanım kimlikleri, meta verileri ve müşteri bilgileri bulunur hak talebi. Cihazlar API'nin merkezinde olduğu için bunları neredeyse yöntemlerine göz atın. Daha fazla bilgi için Device sayfasını inceleyin.
DeviceIdentifier
Üretilmiş bir cihazı tanımlamak için IMEI veya MEID gibi donanım kimliklerini içerir olanak tanır. Cihazı hedeflemek için DeviceIdentifier kullanın üzerinde hak talebinde bulunabilirsiniz. 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 şu sayfaya bakın: API Referansı.

Müşteri oluşturma

Android cihazlarda müşteri oluşturmaktan bayi sorumludur ona bağlıyor. Müşteri bu hesabı şu amaçlarla kullanacaktır: el değmeden kayıt portalına erişerek temel hazırlık ayarlarını yapılandırarak cihazlar. 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 hesaplarıdır.

Aşağıdakileri oluşturmak için create API yöntemini çağırabilirsiniz: müşteri hesapları el değmeden kayıt sürecini başlatabilir. Çünkü müşterileriniz el değmeden kayıt portalına eklemesi gereken şirket adını bunu onaylayın. Bir müşterinin adını, bir fırsattır.

Google Hesabı'na sahip olmanız gerekir. Kişisel Gmail hesaplarını API'ye gidin. Müşterinin hesabı ilişkilendirme konusunda yardıma ihtiyacı olursa talimatların kaynağı Google Hesabı ilişkilendirin.

API'yi çağırarak müşteri oluşturduktan sonra bu müşteri, çalışanlarını yönetir portal erişimi — müşterilerinizin bilgilerini düzenleyemezsiniz daha fazla bilgi edineceksiniz. Snippet aşağıda bir müşteriyi nasıl oluşturabileceğiniz 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 talep edildiğinde cihaz eklenir El değmeden kayıt özelliğine geri dönüyor ve müşteriye, temel hazırlık ayarlarını kontrol edin.

Cihazın temel hazırlık 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. partners.devices.claim numaralı telefonu arayın veya partners.devices.claimAsync tartışmaktır. 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 için hak talebi iptal ediliyor

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, yerel bayi ağınızdaki bayi iş ortaklarını temsil etmek için tedarikçi firmaları kullanabilirsiniz global bayi ağındaki operatörlere veya sizin adınıza çalışır. Tedarikçiler kullanıcılarınızı, müşterilerinizi ve aralarınızı cihazlar:

  • Oluşturduğunuz tedarikçiler el değmeden kayıt hesabınızı veya her birini göremez Diğer'in hesapları.
  • Tedarikçilerinizin müşterilerini ve cihazlarını görüntüleyebilir ve kaydınızı iptal edebilirsiniz. Satıcının cihazları. Ancak cihazları tedarikçilerinize atayamazsınız. müşterilerine yöneliktir.
ziyaret edin.

Tedarikçi firmanız için tedarikçi oluşturmak üzere 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 bu yöntemlerin ikisi de kullanılmaktadır tedarikçilerin Hizmet Şartları durumunu gösteren bir rapor yazdırmak müşteriler:

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ının talep ettiği bir cihaz için hak talebini iptal edebilir. Şu özelliklere sahip diğer API çağrıları: Cihazları değiştiriyorsanız kuruluşunuzun cihaz için 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ı eş zamansız son ekine (örneğin, claimAsync) sahip olmalıdır.

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 düzenli olarak işlemin durumunu kontrol etmek.

İşlemler

Uzun süreli 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'i, çağrıdan sonra tipik bir yanıtı göstermektedir updateMetadataAsync:

{
  "name": "operations/apibatchoperation/1234567890123476789"
}

Her işlemde bağımsız görevlerin listesi bulunur. Telefonla arama operations.get ve anlamına gelir. 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 done alanındaki işlemi kontrol edin true değerine ayarlanır. done eksik veya false ise işlem hâlâ devam ediyor çalışıyor.

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 isteğe bağlı olarak kullanırız. Görevin başarılı mı yoksa başarısız mı olduğunu kontrol etme (result alanını kullanın).

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 ilerleme durumunu izlemesi gerekiyorsa düzenli olarak işlemidir. metadata alanı, DevicesLongRunningOperationMetadata örneğini kontrol edebilirsiniz. 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. Çünkü progress işlem tamamlanırken değer 100 olabilir. bir işlemin done alanını kontrol ederek ve bir sonuç elde edilir.
devicesCount İşlemdeki güncelleme sayısını gösterir. Bu hesabınızdaki güncelleme sayısından farklı olabilir. isteği gönderin.

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 daha gelişmiş ve karmaşık bir göreve koşucu aracı. 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 sürecin tamamlanmasını bekliyorlarsa düzenli ilerleme güncellemelerinden yararlanabilirler. belirir.

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. Sayfalı sonuçlar sayesinde uygulamanız, büyük listeleri tek seferde bir sayfada işlememiz gerekir.

API yöntemini çağırdıktan sonra yanıtın nextPageToken. 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 sayfa.

Aşağıdaki örnek yöntem, uygulamanızın bir cihaz listesini nasıl yazdırabileceğini gösterir. bir sayfa görüntüleme:

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.