Регион 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"
}
Чтобы устранить эту проблему, убедитесь, что все регионы, которые вы пытаетесь обновить, существуют, прежде чем отправлять запрос.