Permintaan Pengelompokan

Dokumen ini menunjukkan cara mengelompokkan panggilan API sekaligus untuk mengurangi jumlah koneksi HTTP yang harus dibuat oleh klien Anda.

Dokumen ini secara khusus membahas pembuatan permintaan batch dengan mengirim permintaan HTTP. Jika Anda menggunakan library klien Google untuk membuat permintaan batch, lihat dokumentasi library klien.

Ringkasan

Setiap koneksi HTTP yang dibuat oleh klien Anda menghasilkan sejumlah overhead tertentu. Display & Video 360 API mendukung pengelompokan, untuk memungkinkan klien Anda menempatkan beberapa panggilan API ke dalam satu permintaan HTTP.

Contoh situasi saat Anda mungkin ingin menggunakan pengelompokan:

  • Mengambil resource dari beberapa pengiklan.
  • Membuat atau memperbarui fasilitas secara massal.
  • Mengedit penargetan di beberapa item baris.

Dalam setiap kasus, daripada mengirim setiap panggilan secara terpisah, Anda dapat mengelompokkannya ke dalam satu permintaan HTTP. Semua permintaan internal harus mengarah ke Google API yang sama.

Anda dibatasi hingga 1.000 panggilan dalam satu permintaan batch. Jika Anda perlu melakukan lebih banyak panggilan dari itu, gunakan beberapa permintaan batch.

Catatan: Sistem batch untuk Display & Video 360 API menggunakan sintaksis yang sama dengan sistem batch processing OData, tetapi semantiknya berbeda.

Detail batch

Permintaan batch terdiri dari beberapa panggilan API yang digabungkan menjadi satu permintaan HTTP, yang dapat dikirim ke batchPath yang ditentukan dalam dokumen discovery API. Jalur default-nya adalah /batch/api_name/api_version. Bagian ini menjelaskan sintaksis batch secara mendetail; kemudian, akan muncul contoh.

Catatan: Kumpulan permintaan n yang dikelompokkan bersama-sama dihitung dalam batas penggunaan Anda sebagai permintaan n, bukan sebagai satu permintaan. Permintaan batch dibagi menjadi serangkaian permintaan sebelum diproses.

Format permintaan batch

Permintaan batch adalah satu permintaan HTTP standar yang berisi beberapa panggilan API Display & Video 360, menggunakan jenis konten multipart/mixed. Dalam permintaan HTTP utama tersebut, masing-masing bagian berisi permintaan HTTP bertingkat.

Setiap bagian dimulai dengan header HTTP Content-Type: application/http-nya sendiri. Class ini juga dapat memiliki header Content-ID opsional. Namun, header bagian hanya ada untuk menandai awal bagian; terpisah dari permintaan bertingkat. Setelah server membuka permintaan batch menjadi permintaan terpisah, header bagian akan diabaikan.

Isi setiap bagian itu sendiri merupakan permintaan HTTP lengkap, dengan kata kerja, URL, header, dan isinya sendiri. Permintaan HTTP hanya boleh berisi bagian jalur URL; URL lengkap tidak diizinkan dalam permintaan batch.

Header HTTP untuk permintaan batch luar, kecuali untuk header Content- seperti Content-Type, berlaku ke setiap permintaan dalam batch. Jika Anda menentukan header HTTP tertentu dalam permintaan outer dan panggilan individual, nilai header panggilan individual akan menggantikan nilai header permintaan batch luar. Header untuk setiap satu panggilan hanya berlaku untuk panggilan tersebut.

Misalnya, jika Anda memberikan header Otorisasi untuk suatu panggilan, header tersebut hanya akan berlaku untuk panggilan tersebut. Jika Anda memberikan header Otorisasi untuk permintaan luar, header tersebut akan berlaku untuk semua panggilan individual kecuali jika header tersebut menggantinya dengan header Otorisasi sendiri.

Saat menerima permintaan batch, server menerapkan parameter kueri dan header permintaan outer (yang sesuai) ke setiap bagian, lalu memperlakukan setiap bagian seolah-olah merupakan permintaan HTTP terpisah.

Respons terhadap permintaan batch

Respons server adalah satu respons HTTP standar dengan jenis konten multipart/mixed; setiap bagian adalah respons terhadap salah satu permintaan dalam batch permintaan, dalam urutan yang sama dengan permintaan tersebut.

Seperti bagian dalam permintaan, setiap bagian respons berisi respons HTTP lengkap, termasuk kode status, header, dan isi. Dan seperti bagian dalam permintaan, setiap bagian respons didahului oleh header Content-Type yang menandai awal bagian.

Jika bagian tertentu dari permintaan memiliki header Content-ID, maka bagian respons yang sesuai memiliki header Content-ID yang cocok, dengan nilai asli yang diawali dengan string response-, seperti yang ditunjukkan dalam contoh berikut singkat ini.

Catatan: Server dapat melaksanakan panggilan Anda dengan urutan apa pun. Jangan menganggap eksekusinya dilakukan sesuai urutan yang Anda tentukan. Jika Anda ingin memastikan bahwa dua panggilan terjadi dalam urutan tertentu, Anda tidak dapat mengirimkannya dalam satu permintaan; sebagai gantinya, kirim pesan pertama saja, lalu tunggu respons terhadap pesan pertama sebelum mengirim yang kedua.

Contoh

Contoh berikut menunjukkan penggunaan batch dengan Display & Video 360 API.

Contoh permintaan batch

POST /batch HTTP/1.1
Host: displayvideo.googleapis.com
Authorization: Bearer your_auth_code
Content-Type: multipart/mixed; boundary=batch_foobarbaz
Content-Length: total_content_length

--batch_foobarbaz
Content-Type: application/http
Content-Transfer-Encoding: binary
MIME-Version: 1.0
Content-ID: <item1:12930812@displayvideo.example.com>

PATCH /v1/advertisers/advertiser_id?updateMask=displayName&fields=advertiserId,displayName HTTP/1.1
Content-Type: application/json; charset=UTF-8
Authorization: Bearer your_auth_code

{
  "displayName": "Updated Advertiser Name"
}
--batch_foobarbaz
Content-Type: application/http
Content-Transfer-Encoding: binary
MIME-Version: 1.0
Content-ID: <item2:12930812@displayvideo.example.com>

PATCH /v1/advertisers/advertiser_id/lineItems/line_item_id?updateMask=displayName&fields=lineItemId,displayName HTTP/1.1
Content-Type: application/json; charset=UTF-8
Authorization: Bearer your_auth_code

{
  "displayName": "Updated Line Item Name"
}

--batch_foobarbaz--

Contoh respons batch

Ini adalah respons terhadap contoh permintaan di bagian sebelumnya.

HTTP/1.1 200
Content-Length: response_total_content_length
Content-Type: multipart/mixed; boundary=batch_foobarbaz

--batch_foobarbaz
Content-Type: application/http
Content-ID: <response-item1:12930812@displayvideo.example.com>

HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: response_part_1_content_length

{
  "advertiserId": advertiser_id,
  "displayName": "Updated Advertiser Name"
}

--batch_foobarbaz
Content-Type: application/http
Content-ID: <response-item2:12930812@displayvideo.example.com>

HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: response_part_2_content_length

{
  "lineItemId": line_item_id,
  "displayName": "Updated Line Item Name"
}

--batch_foobarbaz--

Menggunakan library klien

Contoh kode berikut menunjukkan cara membuat permintaan batch menggunakan library klien Google API. Lihat panduan memulai masing-masing untuk mengetahui informasi selengkapnya tentang cara menginstal library dan menyiapkannya.

Java

Long advertiserId = advertiser-id;
List<Long> lineItemIds = Arrays.asList(line-item-id-1, line-item-id-2);

BatchRequest batch = service.batch();
JsonBatchCallback<LineItem> callback = new JsonBatchCallback<LineItem>() {
  public void onSuccess(LineItem lineItem, HttpHeaders responseHeaders) {
    System.out.printf("Line Item '%s' is now active.\n",
        lineItem.getName());
  }

  public void onFailure (GoogleJsonError error, HttpHeaders responseHeaders)
      throws IOException{
    System.out.printf("Error activating line item: %s\n", error.getMessage());
  }
};

LineItem activatedLineItem = new LineItem().setEntityStatus("ENTITY_STATUS_ACTIVE");

for (Long lineItemId: lineItemIds) {
  service.advertisers().lineItems().patch(advertiserId, lineItemId, activatedLineItem)
      .setUpdateMask("entityStatus").queue(batch, callback);
}
batch.execute();

Python

advertiser_id = advertiser-id
line_item_ids = [line-item-id-1, line-item-id-2]

def callback(request_id, response, exception):
    if exception is not None:
        print('Error activating line item "%s": %s' %
              request_id, exception)
    else:
        print('Line item "%s" is now active.' %
              response.get('name'))

batch = service.new_batch_http_request(callback=callback)

line_item_obj = {
    'entityStatus': 'ENTITY_STATUS_ACTIVE'
}

for line_item_id in line_item_ids:
    request = service.advertisers().lineItems().patch(
        advertiserId=advertiser_id,
        lineItemId=line_item_id,
        updateMask="entityStatus",
        body=line_item_obj
    )
    batch.add(request, request_id=line_item_id)

batch.execute()

PHP

$advertiserId = advertiser-id;
$lineItemIds = array(line-item-id-1, line-item-id-2);

// Enable batching on client and create current batch
$service->getClient()->setUseBatch(true);
$batch = $service->createBatch();

// Create line item with updated fields
$updatedLineItem = new Google_Service_DisplayVideo_LineItem();
$updatedLineItem->setEntityStatus('ENTITY_STATUS_ACTIVE');

// Create request parameter array with update mask
$optParams = array('updateMask' => 'entityStatus');

// Add each patch request to the batch
foreach($lineItemIds as $lineItemId) {
    $request = $this->service->advertisers_lineItems->patch(
        $advertiserId,
        $lineItemId,
        $updatedLineItem,
        $optParams
    );
    $requestId = $lineItemId;
    $batch->add($request, $requestId);
}

// Execute batch request
$results = $batch->execute();

// Iterate through results
foreach($results as $responseId => $lineItem) {
    $lineItemId = substr($responseId, strlen('response-') + 1);
    if ($lineItem instanceof Google_Service_Exception) {
        $e = $lineItem;
        printf(
            "Error activating line item '%s': %s\n",
            $lineItemId,
            $e->getMessage()
        );
    } else {
        printf("Line item '%s' is now active.\n", $lineItem->getName());
    }
}
$service->getClient()->setUseBatch(false);