Как управлять пакетной обработкой регионов

Регион Merchant API – это географический регион, который можно использовать в качестве цели, связанной с ресурсом accounts.products.regionalInventories. Вы можете задать регионы как наборы почтовых индексов или, в некоторых странах, используя готовые геотаргетинговые настройки. Подробнее о том, как настроить регионы…

Merchant API предоставляет пакетные конечные точки для управления регионами. С помощью одного вызова API можно создать, изменить или удалить до 100 регионов. Это особенно удобно для продавцов, которые управляют ценами и наличием товаров на уровне региона (RAAP) в большом масштабе, поскольку позволяет повысить эффективность и упростить интеграцию.

Обзор

Пакетный API позволяет выполнять следующие действия с помощью связанных методов:

  • Создание нескольких регионов в одном запросе: regions:batchCreate
  • Удалить сразу несколько регионов: regions:batchDelete
  • Чтобы обновить сразу несколько регионов, выполните следующие действия: regions:batchUpdate

Требования

Для аутентификации всех пакетных запросов требуется роль пользователя ADMIN.

Как создать несколько регионов

В этом примере показано, как создать два новых региона (один с таргетингом на почтовые индексы, а другой – с геотаргетингом) с помощью одного вызова функции BatchCreateRegions.

Запрос

Создайте URL запроса следующим образом:

POST
https://merchantapi.googleapis.com/accounts/v1/accounts/{ACCOUNT_ID}/regions:batchCreate

Тело запроса содержит список объектов requests, каждый из которых определяет regionId и данные region, которые нужно создать.

{
  "requests": [
    {
      "regionId": "seattle-area-98340",
      "region": {
        "displayName": "Seattle Region",
        "postalCodeArea": {
          "regionCode": "US",
          "postalCodes": [
            {
              "begin": "98340"
            }
          ]
        }
      }
    },
    {
      "regionId": "co-de-states",
      "region": {
        "displayName": "Colorado and Delaware",
        "geoTargetArea": {
          "geotargetCriteriaIds": [
            "21138",
            "21141"
          ]
        }
      }
    }
  ]
}

Ответ

При успешном выполнении запроса возвращается список новых объектов region.

{
  "regions": [
    {
      "name": "accounts/{ACCOUNT_ID}/regions/seattle-area-98340",
      "displayName": "Seattle Region",
      "postalCodeArea": {
        "regionCode": "US",
        "postalCodes": [
          {
            "begin": "98340"
          }
        ]
      },
      "regionalInventoryEligible": true,
      "shippingEligible": true
    },
    {
      "name": "accounts/{ACCOUNT_ID}/regions/co-de-states",
      "displayName": "Colorado and Delaware",
      "geotargetArea": {
        "geotargetCriteriaIds": [
          "21138",
          "21141"
        ]
      },
      "regionalInventoryEligible": false,
      "shippingEligible": false
    }
  ]
}

В следующем примере показано, как создать несколько регионов в пакетном запросе:

Java

import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.accounts.v1.BatchCreateRegionsRequest;
import com.google.shopping.merchant.accounts.v1.BatchCreateRegionsResponse;
import com.google.shopping.merchant.accounts.v1.CreateRegionRequest;
import com.google.shopping.merchant.accounts.v1.Region;
import com.google.shopping.merchant.accounts.v1.Region.PostalCodeArea;
import com.google.shopping.merchant.accounts.v1.Region.PostalCodeArea.PostalCodeRange;
import com.google.shopping.merchant.accounts.v1.RegionsServiceClient;
import com.google.shopping.merchant.accounts.v1.RegionsServiceSettings;
import java.util.ArrayList;
import java.util.List;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;

/** This class demonstrates how to create multiple regions for a Merchant Center account. */
public class BatchCreateRegionsSample {

  private static String getParent(String accountId) {
    return String.format("accounts/%s", accountId);
  }

  public static void batchCreateRegions(Config config, List<String> regionIds) throws Exception {

    // Obtains OAuth token based on the user's configuration.
    GoogleCredentials credential = new Authenticator().authenticate();

    // Creates service settings using the credentials retrieved above.
    RegionsServiceSettings regionsServiceSettings =
        RegionsServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();

    // Creates parent to identify where to insert the regions.
    String parent = getParent(config.getAccountId().toString());

    // Calls the API and catches and prints any network failures/errors.
    try (RegionsServiceClient regionsServiceClient =
        RegionsServiceClient.create(regionsServiceSettings)) {

      List<CreateRegionRequest> requests = new ArrayList<>();
      for (String regionId : regionIds) {
        requests.add(
            CreateRegionRequest.newBuilder()
                .setParent(parent)
                .setRegionId(regionId)
                .setRegion(
                    Region.newBuilder()
                        .setDisplayName("Region " + regionId)
                        .setPostalCodeArea(
                            PostalCodeArea.newBuilder()
                                .setRegionCode("US")
                                .addPostalCodes(
                                    PostalCodeRange.newBuilder()
                                        .setBegin("10001")
                                        .setEnd("10282")
                                        .build())
                                .build())
                        .build())
                .build());
      }

      BatchCreateRegionsRequest request =
          BatchCreateRegionsRequest.newBuilder().setParent(parent).addAllRequests(requests).build();

      System.out.println("Sending Batch Create Regions request");
      BatchCreateRegionsResponse response = regionsServiceClient.batchCreateRegions(request);
      System.out.println("Inserted Regions Names below");
      // The last part of the region name will be the ID of the region.
      // Format: `accounts/{account}/region/{region}`
      response.getRegionsList().forEach(region -> System.out.println(region.getName()));

    } catch (Exception e) {
      System.out.println(e);
    }
  }

  public static void main(String[] args) throws Exception {
    Config config = Config.load();
    // The unique IDs of the regions to create.
    List<String> regionIds = new ArrayList<>();
    regionIds.add("REGION_1");
    regionIds.add("REGION_2");
    regionIds.add("REGION_3");
    regionIds.add("REGION_4");
    regionIds.add("REGION_5");

    batchCreateRegions(config, regionIds);
  }
}

Как изменить несколько регионов

В примере ниже показано, как с помощью BatchUpdateRegions обновить свойства displayName и postalCodeArea для двух существующих регионов. Чтобы изменить целевой регион, необходимо указать region.name.

Запрос

Создайте URL запроса следующим образом:

POST https://merchantapi.googleapis.com/accounts/v1/accounts/{ACCOUNT_ID}/regions:batchUpdate

Тело запроса содержит список requests. Для каждого объекта необходимо указать данные region, которые нужно обновить. В поле region.name должен быть указан идентификатор региона, который нужно изменить, например "98005". Укажите ресурс как name, а не accounts/{ACCOUNT_ID}/regions/name. Добавлять updateMask, чтобы указать поля для изменения, необязательно.

{
  "requests": [
    {
      "region": {
        "name": "98005",
        "displayName": "Seattle Updated Region",
        "postalCodeArea": {
          "regionCode": "US",
          "postalCodes": [
            {
              "begin": "98330"
            }
          ]
        }
      },
      "updateMask": "displayName,postalCodeArea"
    },
    {
      "region": {
        "name": "07086",
        "displayName": "NewYork Updated Region",
        "postalCodeArea": {
          "regionCode": "US",
          "postalCodes": [
            {
              "begin": "11*"
            }
          ]
        }
      },
      "updateMask": "displayName,postalCodeArea"
    }
  ]
}

Ответ

При успешном выполнении запроса возвращается список обновленных объектов region.

{
  "regions": [
    {
      "name": "accounts/{ACCOUNT_ID}/regions/98005",
      "displayName": "Seattle Updated Region",
      "postalCodeArea": {
        "regionCode": "US",
        "postalCodes": [
          {
            "begin": "98330"
          }
        ]
      },
      "regionalInventoryEligible": true,
      "shippingEligible": true
    },
    {
      "name": "accounts/{ACCOUNT_ID}/regions/07086",
      "displayName": "NewYork Updated Region",
      "postalCodeArea": {
        "regionCode": "US",
        "postalCodes": [
          {
            "begin": "11*"
          }
        ]
      },
      "regionalInventoryEligible": true,
      "shippingEligible": true
    }
  ]
}

В следующем примере показано, как обновить несколько регионов в пакетном запросе:

Java

import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.protobuf.FieldMask;
import com.google.shopping.merchant.accounts.v1.BatchUpdateRegionsRequest;
import com.google.shopping.merchant.accounts.v1.BatchUpdateRegionsResponse;
import com.google.shopping.merchant.accounts.v1.Region;
import com.google.shopping.merchant.accounts.v1.RegionsServiceClient;
import com.google.shopping.merchant.accounts.v1.RegionsServiceSettings;
import com.google.shopping.merchant.accounts.v1.UpdateRegionRequest;
import java.util.ArrayList;
import java.util.List;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;

/** This class demonstrates how to update multiple regions for a Merchant Center account. */
public class BatchUpdateRegionsSample {

  private static String getParent(String accountId) {
    return String.format("accounts/%s", accountId);
  }

  private static String getRegionName(String accountId, String regionId) {
    return String.format("accounts/%s/regions/%s", accountId, regionId);
  }

  public static void batchUpdateRegions(Config config, List<String> regionIds) throws Exception {

    // Obtains OAuth token based on the user's configuration.
    GoogleCredentials credential = new Authenticator().authenticate();

    // Creates service settings using the credentials retrieved above.
    RegionsServiceSettings regionsServiceSettings =
        RegionsServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();

    // Creates parent to identify where to update the regions.
    String parent = getParent(config.getAccountId().toString());
    String accountId = config.getAccountId().toString();

    // Calls the API and catches and prints any network failures/errors.
    try (RegionsServiceClient regionsServiceClient =
        RegionsServiceClient.create(regionsServiceSettings)) {

      List<UpdateRegionRequest> requests = new ArrayList<>();
      for (String regionId : regionIds) {
        requests.add(
            UpdateRegionRequest.newBuilder()
                .setRegion(
                    Region.newBuilder()
                        .setName(getRegionName(accountId, regionId))
                        .setDisplayName("Updated Region " + regionId)
                        .build())
                .setUpdateMask(FieldMask.newBuilder().addPaths("display_name").build())
                .build());
      }

      BatchUpdateRegionsRequest request =
          BatchUpdateRegionsRequest.newBuilder().setParent(parent).addAllRequests(requests).build();

      System.out.println("Sending Batch Update Regions request");
      BatchUpdateRegionsResponse response = regionsServiceClient.batchUpdateRegions(request);
      System.out.println("Updated Regions Names below");
      // The last part of the region name will be the ID of the region.
      // Format: `accounts/{account}/region/{region}`
      response.getRegionsList().forEach(region -> System.out.println(region.getName()));

    } catch (Exception e) {
      System.out.println(e);
    }
  }

  public static void main(String[] args) throws Exception {
    Config config = Config.load();
    // The unique IDs of the regions to update.
    List<String> regionIds = new ArrayList<>();
    regionIds.add("REGION_1");
    regionIds.add("REGION_2");
    regionIds.add("REGION_3");
    regionIds.add("REGION_4");
    regionIds.add("REGION_5");

    batchUpdateRegions(config, regionIds);
  }
}

Как удалить несколько регионов

Вы можете удалить несколько регионов за один вызов.

Запрос

В приведенном ниже примере показано, как использовать метод BatchDeleteRegions, чтобы удалить два региона за один вызов.

POST
https://merchantapi.googleapis.com/accounts/v1/accounts/{ACCOUNT_ID}/regions:batchDelete

Тело запроса содержит список объектов requests, каждый из которых указывает name (без "accounts/{ACCOUNT_ID}/regions/") региона, который нужно удалить.

{
  "requests":
   [
    {
      "name": "98005"
    },
    {
      "name": "07086"
    }
   ]
}

Ответ

При успешном выполнении запроса возвращается пустое тело ответа, указывающее, что указанные регионы были удалены (или не существовали).

{}

В следующем примере показано, как удалить несколько регионов в пакетном запросе:

Java

import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.accounts.v1.BatchDeleteRegionsRequest;
import com.google.shopping.merchant.accounts.v1.DeleteRegionRequest;
import com.google.shopping.merchant.accounts.v1.RegionsServiceClient;
import com.google.shopping.merchant.accounts.v1.RegionsServiceSettings;
import java.util.ArrayList;
import java.util.List;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;

/** This class demonstrates how to delete multiple regions for a Merchant Center account. */
public class BatchDeleteRegionsSample {

  private static String getParent(String accountId) {
    return String.format("accounts/%s", accountId);
  }

  private static String getRegionName(String accountId, String regionId) {
    return String.format("accounts/%s/regions/%s", accountId, regionId);
  }

  public static void batchDeleteRegions(Config config, List<String> regionIds) throws Exception {

    // Obtains OAuth token based on the user's configuration.
    GoogleCredentials credential = new Authenticator().authenticate();

    // Creates service settings using the credentials retrieved above.
    RegionsServiceSettings regionsServiceSettings =
        RegionsServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();

    // Creates parent to identify where to delete the regions.
    String parent = getParent(config.getAccountId().toString());
    String accountId = config.getAccountId().toString();

    // Calls the API and catches and prints any network failures/errors.
    try (RegionsServiceClient regionsServiceClient =
        RegionsServiceClient.create(regionsServiceSettings)) {

      List<DeleteRegionRequest> requests = new ArrayList<>();
      for (String regionId : regionIds) {
        requests.add(
            DeleteRegionRequest.newBuilder().setName(getRegionName(accountId, regionId)).build());
      }

      BatchDeleteRegionsRequest request =
          BatchDeleteRegionsRequest.newBuilder().setParent(parent).addAllRequests(requests).build();

      System.out.println("Sending Batch Delete Regions request");
      regionsServiceClient.batchDeleteRegions(request);
      System.out.println("Regions deleted successfully");

    } catch (Exception e) {
      System.out.println(e);
    }
  }

  public static void main(String[] args) throws Exception {
    Config config = Config.load();
    // The unique IDs of the regions to delete.
    List<String> regionIds = new ArrayList<>();
    regionIds.add("REGION_1");
    regionIds.add("REGION_2");
    regionIds.add("REGION_3");
    regionIds.add("REGION_4");
    regionIds.add("REGION_5");

    batchDeleteRegions(config, regionIds);
  }
}

Ограничения

Прежде чем начать, ознакомьтесь с правилами:

  • Атомарные операции. Пакетные запросы являются атомарными. Если хотя бы одна операция в пакете завершится неудачно (например, не удастся создать регион), весь пакет будет отклонен и никакие изменения не будут внесены. API вернет ошибку с описанием причины сбоя.
  • Ограничения на пакеты. Каждый пакетный запрос может содержать не более 100 операций с регионами.
  • Квоты. Эти конечные точки используют те же группы квот, что и их аналоги с одной операцией (regions.create, regions.delete, regions.update).

Распространенные ошибки и проблемы

Ниже перечислены распространенные ошибки и способы их устранения.

"В пакете слишком много запросов"

Эта ошибка возникает, если количество операций в массиве запросов превышает ограничение в 100.

"error":
  {
    "code": 400,
    "message": "The number of requests in a batch is too large.",
    "status": "INVALID_ARGUMENT"
  }

Чтобы устранить эту проблему, разделите операции на несколько пакетных запросов, каждый из которых содержит не более 100 операций.

Не заполнено обязательное поле.

Эта ошибка возникает, когда не заполнено обязательное поле. В сообщении об ошибке будет указан недостающий параметр.

Вот сообщения об ошибках, которые могут появляться:

  • Использовать локаль batchCreate нельзя. Причина: [regionId] Required parameter: regionId.
  • Использовать локаль batchUpdate нельзя. Причина: [region.name] Required field not provided..
  • Использовать локаль batchDelete нельзя. Причина: [name] Required parameter: name.

Чтобы устранить проблему, убедитесь, что все обязательные поля присутствуют в каждой операции. Например, каждая запись в запросе batchUpdate должна содержать region.name. При отправке следующего запроса возникает ошибка:

{
  "requests":
  [
    {
      "region":
        {
          "displayName": "An update without a region name"
        },
        "updateMask": "displayName"
    }
  ]
}

"Регион с указанным идентификатором уже существует"

Если вы попытаетесь создать регион с regionId, который уже существует, возникнет ошибка.

Сообщение об ошибке: [regionId] Region with specified id already exists..

Чтобы устранить проблему, убедитесь, что все значения regionId в пакете уникальны и не конфликтуют с существующими регионами.

"Повторяющееся значение в поле region.name или regionId"

Если вы попытаетесь создать или обновить несколько регионов с одинаковым идентификатором в одном пакетном запросе, произойдет ошибка.

Сообщение об ошибке: Duplicate value found for field {fieldName} in this batch request with value {duplicated_value}..

Чтобы устранить проблему, убедитесь, что все значения regionId (для batchCreate) или region.name (для batchUpdate) уникальны в рамках одного пакетного запроса.

"Объект не найден"

Если при использовании команды batchUpdate в запросе указан несуществующий регион, весь пакет будет отклонен с ошибкой 404 NOT_FOUND. Это отличается от команды batchDelete, которая выполняется успешно, даже если регион не существует.

"error": {
    "code": 404,
    "message": "item not found",
    "status": "NOT_FOUND"
}

Чтобы устранить эту проблему, убедитесь, что все регионы, которые вы пытаетесь обновить, существуют, прежде чем отправлять запрос.