Cara kerja

Pengantar

API pendaftaran zero-touch membantu reseller perangkat mengotomatiskan integrasi mereka. Alat penjualan organisasi Anda dapat terintegrasi dalam pendaftaran zero-touch, sehingga pengguna, dan pelanggan Anda, menjadi lebih produktif. Gunakan API untuk membantu pengguna Anda:

  • Menetapkan perangkat yang dibeli ke akun pendaftaran zero-touch pelanggan.
  • Buat akun pendaftaran zero-touch pelanggan Anda.
  • Lampirkan metadata telepon dan pesanan organisasi Anda ke perangkat.
  • Membuat laporan tentang perangkat yang ditetapkan kepada pelanggan.

Dokumen ini memperkenalkan API dan menjelaskan polanya. Jika Anda ingin jelajahi API sendiri, coba panduan memulai untuk Java, .NET, atau Python.

Konsep API

Pelanggan dan perangkat adalah resource inti yang Anda gunakan dalam API. Untuk membuat pelanggan, hubungi create. Anda dapat membuat perangkat menggunakan metode API klaim (lihat di bawah). Organisasi Anda juga dapat membuat pelanggan dan perangkat menggunakan portal pendaftaran zero-touch.

Hubungan perangkat dan resource pelanggan

Pelanggan
Perusahaan yang menjadi tujuan penjualan perangkat organisasi Anda. Pelanggan memiliki name dan ID. Gunakan pelanggan saat Anda ingin mengklaim atau menemukan perangkat mereka. Kepada pelajari lebih lanjut, lihat Customer.
Perangkat
Perangkat Android atau ChromeOS yang mendukung pendaftaran zero-touch di organisasi Anda yang dijual kepada pelanggan. Perangkat memiliki ID hardware, metadata, dan setelan klaim. Perangkat adalah inti dari API, jadi Anda menggunakannya di hampir semua metode. Untuk mempelajari lebih lanjut, lihat Device.
DeviceIdentifier
Mengenkapsulasi ID hardware, seperti IMEI atau MEID, untuk mengidentifikasi perangkat perangkat seluler. Menggunakan DeviceIdentifier untuk menargetkan perangkat yang ingin Anda temukan, perbarui, atau klaim. Untuk mempelajari lebih lanjut, baca ID.
DeviceMetadata
Menyimpan pasangan nilai kunci metadata untuk perangkat. Gunakan DeviceMetadata untuk menyimpan metadata organisasi Anda. Kepada pelajari lebih lanjut, baca Metadata perangkat.

Untuk menampilkan daftar semua metode dan resource API yang dapat digunakan aplikasi Anda, lihat Referensi API.

Membuat pelanggan

Untuk perangkat Android, reseller bertanggung jawab untuk membuat pelanggan atas nama pelanggannya. Pelanggan akan menggunakan akun ini untuk mengakses portal zero-touch untuk mengonfigurasi setelan penyediaan bagi perangkat. Tindakan ini tidak diperlukan untuk perangkat ChromeOS, yang sudah memiliki Workspace yang akan digunakan untuk mengonfigurasi setelan penyediaan.

Anda dapat memanggil metode create API untuk membuat pelanggan untuk pendaftaran zero-touch. Karena pelanggan melihat nama perusahaan di portal pendaftaran zero-touch, pengguna aplikasi harus mengkonfirmasi bahwa itu benar. Anda tidak dapat mengedit nama pelanggan setelah membuat juga merupakan pelanggan Google Workspace.

Anda harus menyertakan minimal satu alamat email perusahaan, yang terkait dengan Akun Google, yaitu sebagai pemilik. Anda tidak dapat menggunakan akun Gmail pribadi dengan Compute Engine API. Jika pelanggan memerlukan bantuan untuk mengaitkan akun, kirim instruksi dari Mengaitkan Akun Google.

Setelah Anda membuat pelanggan dengan memanggil API, mereka akan mengelola akses portal — Anda tidak dapat mengedit informasi pengguna menggunakan API. Cuplikan di bawah ini menunjukkan cara membuat pelanggan:

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()

Untuk mempelajari lebih lanjut tentang peran pemilik dan admin untuk karyawan pelanggan Anda, baca Pengguna portal.

Mengklaim perangkat untuk pelanggan

Setelah pelanggan membeli perangkat, mereka dapat mengonfigurasi penyediaan untuk perangkat ini di akun mereka. Mengklaim bahwa perangkat akan menambahkan perangkat tersebut ke pendaftaran zero-touch dan memberi pelanggan kemampuan untuk mengonfigurasi setelan penyediaan.

Data penyediaan perangkat memiliki bagian untuk pendaftaran zero-touch. Anda menetapkan perangkat dengan mengklaim bagian pendaftaran zero-touch catatan untuk juga merupakan pelanggan Google Workspace. Panggil partners.devices.claim atau Metode partners.devices.claimAsync dengan pelanggan sebagai argumen. Selalu berikan SECTION_TYPE_ZERO_TOUCH sebagai nilai untuk sectionType.

Anda harus membatalkan klaim (lihat di bawah) perangkat pelanggan sebelum Anda dapat mengklaim perangkat yang sama untuk pelanggan yang berbeda. Metode klaim memvalidasi kolom DeviceIdentifier, termasuk IMEI atau MEID, atau nomor seri, nama produsen dan model, serta mengesahkan ID perangkat untuk perangkat ChromeOS, saat membuat perangkat baru.

Cuplikan di bawah ini menunjukkan cara mengklaim perangkat:

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()

Membatalkan klaim perangkat

Organisasi Anda dapat membatalkan klaim perangkat dari pelanggan. Membatalkan klaim perangkat menghapusnya dari pendaftaran zero-touch. Reseller mungkin membatalkan klaim perangkat yang yang ingin dimigrasikan ke akun lain, dikembalikan, atau diklaim secara keliru. Panggil metode partners.devices.unclaim atau partners.devices.unclaimAsync untuk membatalkan klaim perangkat Anda dari pelanggan.

Vendor

Anda dapat menggunakan vendor untuk mewakili partner reseller di jaringan dealer Anda, operator dalam jaringan reseller global, atau organisasi mana pun yang menjual perangkat atas nama Anda. Vendor membantu Anda memisahkan pengguna, pelanggan, dan perangkat:

  • Vendor yang Anda buat tidak dapat melihat atau masing-masing akun pendaftaran zero-touch Anda akun orang lain.
  • Anda dapat melihat pelanggan dan perangkat vendor, serta dapat membatalkan pendaftaran perangkat vendor. Namun, Anda tidak dapat menetapkan perangkat ke pelanggan.

Gunakan portal untuk membuat vendor bagi organisasi — Anda tidak dapat menggunakan API. Peran akun Anda harus Pemilik untuk membuat vendor baru. Jika organisasi Anda memiliki vendor, Anda dapat memanggil partners.vendors.list untuk membuat daftar vendor dan partners.vendors.customers.list untuk mendapatkan pelanggan vendor Anda. Contoh berikut menggunakan kedua metode ini untuk mencetak laporan yang menampilkan status Persyaratan Layanan vendor pelanggan:

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'])

Jika Anda memiliki sekumpulan perangkat, Anda mungkin perlu mengetahui {i>reseller<i} atau vendor mengklaim perangkat tersebut. Untuk mendapatkan ID reseller numerik, periksa nilai kolom resellerId dalam catatan klaim perangkat.

Organisasi Anda dapat membatalkan klaim perangkat yang diklaim vendor. Untuk panggilan API lain yang mengubah perangkat, Anda harus memeriksa apakah organisasi Anda telah mengklaim perangkat tersebut sebelum memanggil metode API. Contoh berikut menunjukkan cara melakukannya:

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

Operasi batch yang berjalan lama

API ini menyertakan versi asinkron dari metode perangkat. Metode ini memungkinkan batch processing untuk banyak perangkat, sedangkan akan memproses satu perangkat untuk setiap permintaan API. Nama metode asinkron memiliki akhiran Asynchronous, misalnya claimAsync.

Metode API asinkron menampilkan hasil sebelum pemrosesan selesai. Metode asinkron juga membantu aplikasi (atau alat) Anda tetap responsif untuk pengguna sementara mereka menunggu operasi yang berjalan lama untuk selesai. Aplikasi Anda harus memeriksa status operasi secara berkala.

Operasi

Anda menggunakan Operation untuk melacak operasi batch yang berjalan lama. J panggilan yang berhasil ke metode asinkron akan mengembalikan referensi ke operasi dalam responsnya. Cuplikan JSON di bawah ini menunjukkan respons yang umum setelah memanggil updateMetadataAsync:

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

Setiap operasi berisi daftar tugas individual. Telepon operations.get untuk mengetahui informasi tentang status dan hasil tugas yang terkandung dalam operasi tersebut. Cuplikan di bawah ini menunjukkan bagaimana Anda mungkin melakukan hal ini. Di aplikasi Anda sendiri, Anda harus menangani error.

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()

Untuk mengetahui apakah operasi selesai, periksa operasi untuk kolom done dengan nilai true. Jika done tidak ada atau false, operasi masih sedang berjalan.

Respons

Setelah operasi selesai, API akan memperbarui operasi dengan hasilnya—bahkan jika semua atau tidak satu pun tugas individu yang berhasil. Kolom response adalah DevicesLongRunningOperationResponse yang memerinci pemrosesan setiap perangkat dalam operasi.

Periksa kolom successCount untuk mengetahui secara efisien apakah ada tugas yang gagal dan hindari melakukan iterasi melalui daftar hasil yang besar. Kolom perDeviceStatus pada DevicesLongRunningOperationResponse adalah daftar Instance OperationPerDevice yang memberikan detail setiap perangkat melakukan operasi tersebut. Urutan daftar cocok dengan tugas dalam permintaan asli.

Setiap tugas OperationPerDevice berisi kolom result dan ringkasan pengingat sesuai permintaan yang diterima oleh server. Memeriksa apakah tugas berhasil atau gagal menggunakan kolom result.

Cuplikan JSON di bawah ini menunjukkan bagian dari respons umum dari suatu operasi setelah panggilan ke updateMetadataAsync:

"response": {
  "perDeviceStatus": [
    {
      "result": {
        "deviceId": "12345678901234567",
        "status": "SINGLE_DEVICE_STATUS_SUCCESS"
      },
      "updateMetadata": {
        "deviceId": "12345678901234567",
        "deviceMetadata": {
          "entries": {
            "phonenumber": "+1 (800) 555-0100"
          }
        }
      }
    }
  ],
  "successCount": 1
}

Memantau progres

Jika aplikasi Anda perlu melacak progres, Anda harus mengambil kembali secara berkala operasi. Kolom metadata berisi DevicesLongRunningOperationMetadata untuk membantu aplikasi Anda memeriksa progres terbaru dari operasi yang sedang berjalan. Gunakan kolom DevicesLongRunningOperationMetadata yang tercantum dalam tabel untuk melacak kemajuan operasi:

Kolom Penggunaan umum
processingStatus Perubahan dari BATCH_PROCESS_PENDING menjadi BATCH_PROCESS_IN_PROGRESS, lalu ke BATCH_PROCESS_PROCESSED seiring berjalannya operasi.
progress Persentase update yang diproses. Aplikasi Anda dapat menggunakan ini untuk memperkirakan waktu selesai. Karena progress dapat menjadi 100 saat operasi diselesaikan, periksa kolom done dari suatu operasi untuk mengetahui apakah selesai dan memberikan hasil.
devicesCount Menampilkan jumlah update dalam operasi. Ini mungkin berbeda dari jumlah pembaruan di jika API tidak dapat mengurai beberapa update.

Contoh sederhana di bawah ini menunjukkan cara aplikasi menggunakan metadata progres untuk mengatur interval polling. Di aplikasi, Anda mungkin memerlukan tugas yang lebih rumit {i>runner<i} untuk polling. Anda juga perlu menambahkan penanganan error.

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)

Pilih pendekatan polling yang sesuai untuk pengguna aplikasi Anda. Beberapa pengguna aplikasi mungkin mendapat manfaat dari pembaruan kemajuan secara berkala jika mereka sedang menunggu proses untuk selesai.

Hasil dalam halaman

Metode partners.devices.findByOwner API dapat menampilkan daftar perangkat yang sangat besar. Untuk mengurangi ukuran respons, ini dan metode API lainnya (seperti partners.devices.findByIdentifier) mendukung hasil yang dibagi-bagi. Dengan hasil yang dibagi-bagi, aplikasi Anda dapat secara iteratif meminta dan memproses daftar besar pada satu laman pada satu waktu.

Setelah memanggil metode API, periksa apakah respons mencakup nilai untuk nextPageToken Jika nextPageToken bukan null, aplikasi Anda dapat menggunakannya untuk mengambil halaman perangkat lain dengan memanggil metode itu lagi. Anda perlu menyetel batas atas untuk jumlah perangkat di parameter limit. Jika nextPageToken adalah null, aplikasi Anda telah meminta halaman terakhir.

Contoh metode di bawah ini menunjukkan cara aplikasi mencetak daftar perangkat, satu halaman pada satu waktu:

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);

Langkah berikutnya

Setelah Anda mengetahui cara kerja API, cobalah contoh dengan panduan memulai untuk Java, .NET, atau Python.