ব্যাচিং অনুরোধ

এই নথিটি দেখায় যে কীভাবে আপনার ক্লায়েন্টকে HTTP সংযোগগুলি তৈরি করতে হবে তা কমাতে API কলগুলিকে একসাথে ব্যাচ করতে হয়৷

এই নথিটি বিশেষভাবে একটি HTTP অনুরোধ পাঠিয়ে একটি ব্যাচ অনুরোধ করার বিষয়ে। যদি, পরিবর্তে, আপনি একটি ব্যাচ অনুরোধ করতে একটি Google ক্লায়েন্ট লাইব্রেরি ব্যবহার করেন, ক্লায়েন্ট লাইব্রেরির ডকুমেন্টেশন দেখুন।

ওভারভিউ

প্রতিটি HTTP সংযোগ আপনার ক্লায়েন্ট একটি নির্দিষ্ট পরিমাণ ওভারহেড ফলাফল করে। Display & Video 360 API ব্যাচিং সমর্থন করে, আপনার ক্লায়েন্টকে একটি একক HTTP অনুরোধে একাধিক API কল করার অনুমতি দিতে।

আপনি যখন ব্যাচিং ব্যবহার করতে চাইতে পারেন এমন পরিস্থিতির উদাহরণ:

  • একাধিক বিজ্ঞাপনদাতাদের মাধ্যমে সম্পদ পুনরুদ্ধার করা হচ্ছে।
  • প্রচুর পরিমাণে সংস্থান তৈরি বা আপডেট করা।
  • একাধিক লাইন আইটেম জুড়ে লক্ষ্যকরণ সম্পাদনা করা হচ্ছে।

প্রতিটি ক্ষেত্রে, প্রতিটি কল আলাদাভাবে পাঠানোর পরিবর্তে, আপনি একটি একক HTTP অনুরোধে তাদের একসাথে গোষ্ঠী করতে পারেন। সমস্ত অভ্যন্তরীণ অনুরোধ একই Google API এ যেতে হবে।

আপনি একটি একক ব্যাচ অনুরোধে 1000 কলের মধ্যে সীমাবদ্ধ। আপনি যদি এর চেয়ে বেশি কল করতে চান তবে একাধিক ব্যাচ অনুরোধ ব্যবহার করুন।

দ্রষ্টব্য : Display & Video 360 API-এর ব্যাচ সিস্টেম OData ব্যাচ প্রসেসিং সিস্টেমের মতো একই সিনট্যাক্স ব্যবহার করে, কিন্তু শব্দার্থবিদ্যা আলাদা।

ব্যাচের বিবরণ

একটি ব্যাচ অনুরোধে একাধিক API কল থাকে যা একটি HTTP অনুরোধের সাথে মিলিত হয়, যা API আবিষ্কার নথিতে নির্দিষ্ট batchPath পাঠানো যেতে পারে। ডিফল্ট পাথ হল /batch/ api_name / api_version । এই বিভাগে ব্যাচ সিনট্যাক্স বিস্তারিতভাবে বর্ণনা করে; পরে, একটি উদাহরণ আছে.

দ্রষ্টব্য : একত্রে ব্যাচ করা n অনুরোধের একটি সেট আপনার ব্যবহারের সীমা n অনুরোধ হিসাবে গণনা করে, একটি অনুরোধ হিসাবে নয়। ব্যাচ অনুরোধ প্রক্রিয়াকরণের আগে অনুরোধের একটি সেট মধ্যে বিভক্ত করা হয়.

একটি ব্যাচ অনুরোধের বিন্যাস

একটি ব্যাচ অনুরোধ হল একটি একক স্ট্যান্ডার্ড HTTP অনুরোধ যাতে একাধিক Display & Video 360 API কল থাকে, multipart/mixed কন্টেন্ট টাইপ ব্যবহার করে। সেই প্রধান HTTP অনুরোধের মধ্যে, প্রতিটি অংশে একটি নেস্টেড HTTP অনুরোধ থাকে।

প্রতিটি অংশ তার নিজস্ব Content-Type: application/http HTTP হেডার। এটিতে একটি ঐচ্ছিক Content-ID শিরোনামও থাকতে পারে। যাইহোক, অংশের শিরোনামগুলি শুধুমাত্র অংশের শুরুতে চিহ্নিত করার জন্য রয়েছে; তারা নেস্টেড অনুরোধ থেকে আলাদা। সার্ভার ব্যাচের অনুরোধটিকে পৃথক অনুরোধে আনর্যাপ করার পরে, অংশ শিরোনামগুলি উপেক্ষা করা হয়।

প্রতিটি অংশের মূল অংশটি একটি সম্পূর্ণ HTTP অনুরোধ, যার নিজস্ব ক্রিয়া, URL, শিরোনাম এবং বডি রয়েছে। HTTP অনুরোধে শুধুমাত্র URL এর পাথ অংশ থাকতে হবে; ব্যাচ অনুরোধে সম্পূর্ণ URL গুলি অনুমোদিত নয়৷

বাইরের ব্যাচের অনুরোধের জন্য HTTP শিরোনামগুলি, Content- শিরোনামগুলি ব্যতীত যেমন Content-Type , ব্যাচের প্রতিটি অনুরোধের জন্য প্রযোজ্য। আপনি যদি বাইরের অনুরোধ এবং একটি পৃথক কল উভয় ক্ষেত্রে একটি প্রদত্ত HTTP শিরোনাম উল্লেখ করেন, তাহলে পৃথক কল হেডারের মান বাইরের ব্যাচ অনুরোধ শিরোনামের মানকে ওভাররাইড করে। একটি পৃথক কলের শিরোনাম শুধুমাত্র সেই কলের জন্য প্রযোজ্য।

উদাহরণস্বরূপ, যদি আপনি একটি নির্দিষ্ট কলের জন্য একটি অনুমোদন শিরোনাম প্রদান করেন, তাহলে সেই শিরোনামটি শুধুমাত্র সেই কলের জন্য প্রযোজ্য হবে। আপনি যদি বাইরের অনুরোধের জন্য একটি অনুমোদন শিরোনাম প্রদান করেন, তাহলে সেই শিরোনামটি সমস্ত স্বতন্ত্র কলের ক্ষেত্রে প্রযোজ্য হবে যদি না তারা এটিকে তাদের নিজস্ব অথরাইজেশন হেডার দিয়ে ওভাররাইড করে।

যখন সার্ভার ব্যাচ করা অনুরোধটি পায়, তখন এটি প্রতিটি অংশে বাইরের অনুরোধের ক্যোয়ারী প্যারামিটার এবং শিরোনাম (যথাযথ হিসাবে) প্রয়োগ করে এবং তারপর প্রতিটি অংশকে এমনভাবে আচরণ করে যেন এটি একটি পৃথক HTTP অনুরোধ।

একটি ব্যাচ অনুরোধের প্রতিক্রিয়া

সার্ভারের প্রতিক্রিয়া হল multipart/mixed কন্টেন্ট টাইপ সহ একটি একক স্ট্যান্ডার্ড HTTP প্রতিক্রিয়া; প্রতিটি অংশ হল ব্যাচ করা অনুরোধের একটি অনুরোধের প্রতিক্রিয়া, অনুরোধের মতো একই ক্রমে।

অনুরোধের অংশগুলির মতো, প্রতিটি প্রতিক্রিয়া অংশে একটি স্ট্যাটাস কোড, হেডার এবং বডি সহ একটি সম্পূর্ণ HTTP প্রতিক্রিয়া রয়েছে৷ এবং অনুরোধের অংশগুলির মতো, প্রতিটি প্রতিক্রিয়া অংশের আগে একটি Content-Type শিরোনাম থাকে যা অংশের শুরুতে চিহ্নিত করে।

যদি অনুরোধের একটি প্রদত্ত অংশে একটি Content-ID শিরোনাম থাকে, তাহলে প্রতিক্রিয়াটির সংশ্লিষ্ট অংশে একটি মিলযুক্ত Content-ID শিরোনাম থাকে, যার মূল মান স্ট্রিং response- পূর্বে থাকে-, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে।

দ্রষ্টব্য : সার্ভার যেকোনো ক্রমে আপনার কল করতে পারে। আপনি যে ক্রমে তাদের নির্দিষ্ট করেছেন সেই ক্রমে তাদের মৃত্যুদন্ড কার্যকর করার উপর নির্ভর করবেন না। আপনি যদি নিশ্চিত করতে চান যে দুটি কল একটি প্রদত্ত ক্রমে হয়, আপনি সেগুলিকে একক অনুরোধে পাঠাতে পারবেন না; পরিবর্তে, প্রথমটি নিজেই পাঠান, তারপর দ্বিতীয়টি পাঠানোর আগে প্রথমটির প্রতিক্রিয়ার জন্য অপেক্ষা করুন৷

উদাহরণ

নিচের উদাহরণটি Display & Video 360 API-এর সাথে ব্যাচিংয়ের ব্যবহার দেখায়।

উদাহরণ ব্যাচ অনুরোধ

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

উদাহরণ ব্যাচ প্রতিক্রিয়া

এটি পূর্ববর্তী বিভাগে উদাহরণ অনুরোধের প্রতিক্রিয়া।

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

ক্লায়েন্ট লাইব্রেরি ব্যবহার করে

নিম্নলিখিত কোড নমুনাগুলি দেখায় কিভাবে Google APIs ক্লায়েন্ট লাইব্রেরি ব্যবহার করে ব্যাচ অনুরোধ করতে হয়। লাইব্রেরিগুলি কীভাবে ইনস্টল করতে হয় এবং সেগুলি সেট আপ করতে হয় সে সম্পর্কে আরও তথ্যের জন্য সংশ্লিষ্ট কুইকস্টার্ট গাইডগুলি দেখুন৷

জাভা

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

পাইথন

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

পিএইচপি

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