אזור ב-Merchant API מייצג אזור גיאוגרפי שאפשר להשתמש בו כיעד שקשור למשאב accounts.products.regionalInventories. אפשר להגדיר אזורים כאוספים של מספרי מיקוד או, במדינות מסוימות, באמצעות טרגוט גיאוגרפי מוגדר מראש. מידע נוסף מופיע במאמר הגדרת אזורים.
Merchant API מספק נקודות קצה (endpoints) לעיבוד קבוצות של נתונים לניהול האזורים שלכם, ומאפשר לכם ליצור, לעדכן ולמחוק עד 100 אזורים בקריאה אחת ל-API. התכונה הזו מתאימה במיוחד למוכרים שמנהלים זמינות ותמחור לפי אזור (RAAP) בהיקף גדול, כי היא משפרת את היעילות ומפשטת את השילוב.
סקירה כללית
Batch API מאפשר לכם לבצע את הפעולות הבאות באמצעות ה-methods המשויכות:
- יצירת כמה אזורים בבקשה אחת:
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"
}
]
}
"Region with specified ID already exists" (כבר קיים אזור עם המזהה שצוין)
אם מנסים ליצור אזור עם regionId שכבר קיים, מתרחשת שגיאה.
הודעת השגיאה היא [regionId] Region with specified id already exists..
כדי לפתור את הבעיה, מוודאים שכל הערכים של regionId ייחודיים בקבוצת הפריטים ושהם לא מתנגשים עם אזורים קיימים.
"נמצא ערך כפול בשדה region.name או regionId"
אם מנסים ליצור או לעדכן כמה אזורים עם אותו מזהה בבקשת Batch אחת, מתרחשת שגיאה.
הודעת השגיאה היא Duplicate value found for field {fieldName} in this batch
request with value {duplicated_value}..
כדי לפתור את הבעיה, מוודאים שכל הערכים של regionId (עבור batchCreate) או של region.name
(עבור batchUpdate) הם ייחודיים בבקשת Batch אחת.
"Item not found" (הפריט לא נמצא)
כשמשתמשים ב-batchUpdate, אם אזור כלשהו שצוין בבקשה לא קיים, כל הבקשה תיכשל ותוצג השגיאה 404 NOT_FOUND. זה שונה מ-batchDelete, שמוחזרת בהצלחה עבור אזורים שלא קיימים.
"error": {
"code": 404,
"message": "item not found",
"status": "NOT_FOUND"
}
כדי לפתור את הבעיה, צריך לוודא שכל האזורים שאתם מנסים לעדכן קיימים לפני שליחת הבקשה.