Пакетные запросы

В этом документе показано, как объединять вызовы API в пакеты, чтобы уменьшить количество HTTP-соединений, которые должен устанавливать ваш клиент.

Этот документ посвящен выполнению пакетных запросов путем отправки HTTP-запроса. Если же вы используете клиентскую библиотеку Google для выполнения пакетных запросов, обратитесь к документации этой библиотеки .

Обзор

Каждое HTTP-соединение, устанавливаемое вашим клиентом, приводит к определенным накладным расходам. API Manufacturer Center поддерживает пакетную обработку, позволяя вашему клиенту объединять несколько вызовов API в один HTTP-запрос.

Примеры ситуаций, когда может потребоваться пакетная обработка:

    • Загрузка большого количества товаров.

    • Удаление большого количества товаров.

    • Получение большого количества товаров.

В каждом случае, вместо отправки каждого вызова по отдельности, вы можете объединить их в один HTTP-запрос. Все внутренние запросы должны направляться к одному и тому же API Google.

В одном пакетном запросе вы можете совершить не более 1000 вызовов. Если вам необходимо совершить больше вызовов, используйте несколько пакетных запросов.

Примечание : Система пакетной обработки для API центра производителя использует тот же синтаксис, что и система пакетной обработки OData , но семантика отличается.

Детали партии

Пакетный запрос состоит из нескольких вызовов API, объединенных в один HTTP-запрос, который может быть отправлен по batchPath указанному в документе обнаружения API . Путь по умолчанию — /batch/ api_name / api_version . В этом разделе подробно описан синтаксис пакетного запроса; далее приведен пример .

Примечание : Пакет из n запросов, объединенных вместе, учитывается в вашем лимите использования как n запросов, а не как один запрос. Пакет запросов разбивается на несколько отдельных запросов перед обработкой.

Формат пакетного запроса

Пакетный запрос — это один стандартный HTTP-запрос, содержащий несколько вызовов API центра производителя с использованием типа содержимого multipart/mixed . Внутри этого основного HTTP-запроса каждая из его частей содержит вложенный HTTP-запрос.

Каждая часть начинается со своего HTTP-заголовка Content-Type: application/http . Она также может содержать необязательный заголовок Content-ID . Однако заголовки частей служат лишь для обозначения начала части; они отделены от вложенного запроса. После того, как сервер разделит пакетный запрос на отдельные запросы, заголовки частей игнорируются.

Тело каждой части запроса представляет собой полный HTTP-запрос, содержащий собственный глагол, URL-адрес, заголовки и сам запрос. HTTP-запрос должен содержать только путь к URL-адресу; полные URL-адреса в пакетных запросах не допускаются.

HTTP-заголовки для внешнего пакетного запроса, за исключением заголовков Content- , таких как Content-Type , применяются ко всем запросам в пакете. Если вы указываете определенный HTTP-заголовок как во внешнем запросе, так и в отдельном вызове, то значение заголовка отдельного вызова переопределяет значение заголовка внешнего пакетного запроса. Заголовки для отдельного вызова применяются только к этому вызову.

Например, если вы предоставляете заголовок Authorization для конкретного вызова, то этот заголовок применяется только к этому вызову. Если вы предоставляете заголовок Authorization для внешнего запроса, то этот заголовок применяется ко всем отдельным вызовам, если только они не переопределят его своими собственными заголовками Authorization.

Когда сервер получает пакетный запрос, он применяет параметры запроса и заголовки внешнего запроса (при необходимости) к каждой его части, а затем обрабатывает каждую часть так, как если бы это был отдельный HTTP-запрос.

Ответ на пакетный запрос

Ответ сервера представляет собой единый стандартный HTTP-ответ с типом содержимого multipart/mixed ; каждая часть является ответом на один из запросов в пакете, в том же порядке, что и запросы.

Подобно частям запроса, каждая часть ответа содержит полный HTTP-ответ, включая код состояния, заголовки и тело. И, как и в случае с частями запроса, каждой части ответа предшествует заголовок Content-Type , который отмечает начало этой части.

Если определенная часть запроса содержала заголовок Content-ID , то соответствующая часть ответа имеет совпадающий заголовок Content-ID , причем исходное значение предваряется строкой response- , как показано в следующем примере.

Примечание : Сервер может выполнять ваши вызовы в любом порядке. Не рассчитывайте на то, что они будут выполнены в том порядке, в котором вы их указали. Если вы хотите гарантировать выполнение двух вызовов в заданном порядке, вы не можете отправить их в одном запросе; вместо этого отправьте первый вызов отдельно, затем дождитесь ответа на первый вызов, прежде чем отправлять второй.

Пример

В следующем примере показано использование пакетной обработки данных с помощью API центра производителя.

Пример пакетного запроса


POST https://manufacturers.googleapis.com/batch
Authorization: Bearer your_auth_token
Content-Type: multipart/mixed; boundary=--batch_item

--batch_item
Content-Type: application/http
Content-ID: 

PUT /v1/accounts/account_id/products/targetCountry:contentLanguage:productId
Content-Type: application/json

{
   "gtin": "gtin",
   "product_name": "product_name",
   "description": "description",
   "image_link": {
       "image_url": "image_url"
   }
}
--batch_item
Content-Type: application/http
Content-ID: 

GET /v1/accounts/account_id/products/targetCountry:contentLanguage:productId
--batch_item
Content-Type: application/http
Content-ID: 

DELETE /v1/accounts/account_id/products/targetCountry:contentLanguage:productId
--batch_item--

Пример пакетного ответа

Это ответ на пример запроса из предыдущего раздела.



--batch_OycPgXWaQD5f20sVgri2ETiygT65fMaa
Content-Type: application/http
Content-ID: 

HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Vary: Origin
Vary: X-Origin
Vary: Referer

{}

--batch_OycPgXWaQD5f20sVgri2ETiygT65fMaa
Content-Type: application/http
Content-ID: 

HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Vary: Origin
Vary: X-Origin
Vary: Referer

{
  "parent": "accounts/account_id",
  "name": "targetCountry:contentLanguage:productId",
  "targetCountry": "targetCountry",
  "contentLanguage": "contentLanguage",
  "productId": "productId"
}

--batch_OycPgXWaQD5f20sVgri2ETiygT65fMaa
Content-Type: application/http
Content-ID: 

HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Vary: Origin
Vary: X-Origin
Vary: Referer

{}

--batch_OycPgXWaQD5f20sVgri2ETiygT65fMaa--

Предварительные требования

Счет в Центре производителей

Пример пакетной обработки

Приведенный ниже код демонстрирует, как отправлять обновления продукта в пакетном режиме с помощью Java.

Java

String parent = "accounts/123456";
String newProductName = "US:en:product_id_1";

Image image = new Image();
image.setUrl("http://www.example.com/example.png");

Attributes attributes = new Attributes();
attributes.setGtin(ImmmutableList.of("1234567890"));
attributes.setImageLink(image);

// Creates a new BatchRequest object from the ManufacturerCenter object.
BatchRequest batch = manufacturerCenter.batch();

// JsonBatchCallback generic type is Empty to match the return type of update API.
JsonBatchCallback updateProductCallback =  new JsonBatchCallback() {
    public void onSuccess(Empty empty, HttpHeaders responseHeaders) {
        System.out.printf("Product updated successfully.\n");
    }

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

// Adds update product request to batch object.
manufacturerCenter.accounts().products().update(parent, newProductName, attributes)
    .queue(batch, updateProductCallback);

String getProductName = "US:en:product_id_2";

// JsonBatchCallback generic type is Product to match the return type of get API.
JsonBatchCallback getProductCallback =  new JsonBatchCallback() {
    public void onSuccess(Product product, HttpHeaders responseHeaders) {
        System.out.printf("Found product: %s.\n", product.getName());
    }

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

// Adds get product request to batch object.
manufacturerCenter.accounts().products().get(parent, getProductName)
    .queue(batch, getProductCallback);

// Sends batch request to Manufacturer Center API.
batch.execute();