Дополнительный API источников данных позволяет создавать источники данных и управлять ими, чтобы загружать товары через API. Чтобы добавить информацию о товарах в Merchant Center, необходимо указать хотя бы один источник данных.
В этом руководстве описаны распространенные сценарии использования источников данных на основе API. Подробнее о том, как добавлять товары и управлять ими… Управлять источниками данных также можно в интерфейсе Merchant Center. Подробнее о том, как управлять источниками данных…
Важные замечания
При работе с источниками данных в Merchant API учитывайте следующее:
Правила. Дополнительный API источников данных поддерживает правила по умолчанию для связывания дополнительных источников данных с основными. Вы можете изменить порядок дополнительных источников данных в правиле по умолчанию. Создание сложных специальных правил и управление ими не поддерживается напрямую в этом API. Управлять этим можно в интерфейсе Merchant Center.
Дополнительные источники данных в расширенных аккаунтах. API не поддерживает дополнительные источники данных и правила для расширенных аккаунтов (мультиаккаунтов). Управлять дополнительными источниками данных и правилами можно только в интерфейсе Merchant Center.
Как создать основной источник данных о товарах
Если вы хотите создать PrimaryProductDataSource, которая может принимать товары с любым ярлыком и языком, не указывайте feedLabel и contentLanguage. Это упрощает управление для продавцов, которым не требуются отдельные правила или конфигурации для разных стран или языков, поскольку позволяет им управлять только одним идентификатором источника данных.
В противном случае вы можете создать источник данных и ограничить его определенным ярлыком и языком. Если вы планируете использовать правила источника данных или другие настройки (например, таргетинг на страны), которые применяются к определенным комбинациям ярлыков и языков, укажите feedLabel и contentLanguage.
Подробнее о выборе стратегии для источников данных…
Обратите внимание, что источник данных feedLabel не влияет на целевую страну. Например, если вы используете ярлык US, таргетинг на пользователей из США не будет настроен автоматически. Чтобы контролировать, где показываются ваши товары, целевые страны определяются следующим образом:
- На уровне источника данных. Задайте целевые страны по умолчанию в
primary product data sourceс помощью поляcountries. Они будут применяться ко всем товарам в источнике данных. - На уровне товара (онлайн). Для методов интернет-маркетинга укажите целевые страны для отдельных товаров в поле
shippingвproduct attributes. - На уровне аккаунта (местные предложения). Для местных методов маркетинга целевые страны определяются автоматически на основе данных об обычных магазинах, связанных с вашим аккаунтом Merchant Center.
Подробнее о том, как добавлять товары с таргетингом на определенные страны…
Все новые источники данных по умолчанию доступны для всех целевых сервисов, включенных в аккаунте. Подробнее о целевых сервисах… Такой подход обеспечивает единую интегрированную среду и поддерживает многоканальную стратегию.
Таргетинг на страны
Настроить целевые страны можно двумя способами:
Нет стран по умолчанию (гибкий таргетинг). Если вы создадите источник данных с пустым объектом
primaryProductDataSource(как показано в первом примере ниже), то у него не будет целевых стран по умолчанию. Способ определения стран зависит от метода маркетинга:- Интернет-магазин. Вы можете указать целевые страны для каждого товара отдельно, используя атрибут
shippingв сведениях о товарах. - Обычные магазины. Целевые страны определяются автоматически на основе данных о магазинах, связанных с вашим аккаунтом Merchant Center, поэтому указывать информацию о доставке не нужно.
- Интернет-магазин. Вы можете указать целевые страны для каждого товара отдельно, используя атрибут
Страны по умолчанию (таргетинг на уровне источника данных). Вы можете явно указать целевые страны по умолчанию с помощью поля
countries(как показано во втором примере ниже). Все товары, загруженные в этот источник данных, по умолчанию будут таргетироваться на эти страны.
Рекомендации
- Один источник данных с таргетингом на определенные страны. Если все товары в источнике данных предназначены для одной страны или набора стран, задайте поле
countriesв источнике данных. - Один источник данных с таргетингом на разные страны. Если вы управляете одним источником данных, содержащим товары, распространяемые в разных странах, не указывайте
countriesв источнике данных и задайте их на уровне товара с помощью атрибутаshipping. Несколько источников данных для разных стран. Если вы хотите разделить товары или бизнес-правила по регионам, создайте отдельные основные источники данных для каждой страны (или набора стран) и задайте поле
countriesдля каждого источника данных. Хотя управление несколькими идентификаторами источников данных требует дополнительных накладных расходов, это позволяет настраивать отдельные правила источников данных для каждой страны.
Источник данных для любого ярлыка и языка
Когда товары добавляются в этот источник данных с помощью метода products.insert, API принимает любые комбинации значений feedLabel и contentLanguage, указанные в данных о товарах. Источник данных служит единым контейнером для товаров с таргетингом на несколько разных комбинаций языков и ярлыков. Если у вас простая конфигурация, в которой не используются сложные правила для источников данных, рекомендуем не указывать поля feedLabel и contentLanguage.
Ограничения и рекомендации
- Создать источник данных, совместимый с любым ярлыком и языком, можно только для основных источников данных, использующих
API. - Эти источники данных можно связать с дополнительными источниками данных, которые содержат как общие, так и целевые данные. Сопоставление выполняется на основе значений атрибутов
feedLabelиcontentLanguage.
Примеры
Вот пример создания источника данных для любого ярлыка и языка без страны по умолчанию:
POST https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources
{
"displayName": "My API Primary Product Source (No Default Countries)",
"primaryProductDataSource": {}
}
При успешном выполнении запроса возвращается следующий ресурс DataSource:
{
"name": "accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}",
"dataSourceId": "{DATASOURCE_ID}",
"displayName": "My API Primary Product Source (No Default Countries)",
"primaryProductDataSource": {},
"input": "API"
}
Вот пример создания источника данных для любого ярлыка и языка с страной по умолчанию (Великобритания):
POST https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources
{
"displayName": "My API Primary Product Source (GB Default)",
"primaryProductDataSource": {
"countries": ["GB"]
}
}
При успешном выполнении запроса возвращается следующий ресурс DataSource:
{
"name": "accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}",
"dataSourceId": "{DATASOURCE_ID}",
"displayName": "My API Primary Product Source (GB Default)",
"primaryProductDataSource": {
"countries": [
"GB"
]
},
"input": "API"
}
Используйте name нового источника данных, чтобы ссылаться на него при добавлении товаров с помощью Products sub-API.
В примерах кода ниже показано, как создать объект PrimaryProductDataSource, не задавая поля feedLabel, contentLanguage и countries.
Java
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.datasources.v1.CreateDataSourceRequest;
import com.google.shopping.merchant.datasources.v1.DataSource;
import com.google.shopping.merchant.datasources.v1.DataSourcesServiceClient;
import com.google.shopping.merchant.datasources.v1.DataSourcesServiceSettings;
import com.google.shopping.merchant.datasources.v1.PrimaryProductDataSource;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/**
* This class demonstrates how to create a primary product data source for all `feedLabel` and
* `contentLanguage` combinations.
*/
public class CreatePrimaryProductDataSourceMultipleLanguagesSample {
private static String getParent(String merchantId) {
return String.format("accounts/%s", merchantId);
}
public static String createDataSource(Config config, String displayName) throws Exception {
GoogleCredentials credential = new Authenticator().authenticate();
DataSourcesServiceSettings dataSourcesServiceSettings =
DataSourcesServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
String parent = getParent(config.getAccountId().toString());
// The type of data that this datasource will receive.
PrimaryProductDataSource primaryProductDataSource =
PrimaryProductDataSource.newBuilder()
.addCountries("GB")
.build();
try (DataSourcesServiceClient dataSourcesServiceClient =
DataSourcesServiceClient.create(dataSourcesServiceSettings)) {
CreateDataSourceRequest request =
CreateDataSourceRequest.newBuilder()
.setParent(parent)
.setDataSource(
DataSource.newBuilder()
.setDisplayName(displayName)
.setPrimaryProductDataSource(primaryProductDataSource)
.build())
.build();
System.out.println("Sending Create PrimaryProduct DataSource request");
DataSource response = dataSourcesServiceClient.createDataSource(request);
System.out.println("Created DataSource Name below");
System.out.println(response.getName());
return response.getName();
} catch (Exception e) {
System.out.println(e);
System.exit(1);
// Null is necessary to satisfy the compiler as we're not returning a String on failure.
return null;
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
// The displayed data source name in the Merchant Center UI.
String displayName = "Primary Product Data Multiple Languages";
createDataSource(config, displayName);
}
}
PHP
use Google\ApiCore\ApiException;
use Google\Shopping\Merchant\DataSources\V1\Client\DataSourcesServiceClient;
use Google\Shopping\Merchant\DataSources\V1\CreateDataSourceRequest;
use Google\Shopping\Merchant\DataSources\V1\DataSource;
use Google\Shopping\Merchant\DataSources\V1\PrimaryProductDataSource;
/**
* This class demonstrates how to create a primary product datasource for all `feedLabel` and
* `contentLanguage` combinations.
*/
class CreatePrimaryProductDataSourceMultipleLanguagesSample
{
/**
* Creates a primary product data source.
*
* @param int $merchantId The Merchant Center account ID.
* @param string $displayName The displayed data source name in the Merchant Center UI.
*
* @return string The name of the newly created data source.
*/
public function createDataSource(int $merchantId, string $displayName): string
{
// Gets the OAuth credentials to make the request.
$credentials = Authentication::useServiceAccountOrTokenFile();
// Creates options config containing credentials for the client to use.
$options = ['credentials' => $credentials];
// Creates a client.
$dataSourcesServiceClient = new DataSourcesServiceClient($options);
$parent = sprintf('accounts/%s', $merchantId);
// The type of data that this datasource will receive.
$primaryProductDataSource = (new PrimaryProductDataSource())
->setCountries(['GB']);
// Calls the API and catches and prints any network failures/errors.
try {
$response = $dataSourcesServiceClient->createDataSource(
(new CreateDataSourceRequest())
->setParent($parent)
->setDataSource(
(new DataSource())
->setDisplayName($displayName)
->setPrimaryProductDataSource($primaryProductDataSource)
)
);
printf('Created DataSource Name below:' . PHP_EOL);
printf('%s' . PHP_EOL, $response->getName());
return $response->getName();
} catch (ApiException $ex) {
printf('Call failed with message: %s' . PHP_EOL, $ex->getMessage());
exit(1);
}
}
// Helper to execute the sample.
public function callSample(): void
{
$config = Config::generateConfig();
// The Merchant Center Account ID.
$merchantId = $config['accountId'];
// The displayed datasource name in the Merchant Center UI.
$displayName = 'Primary Product Data Multiple Languages';
self::createDataSource($merchantId, $displayName);
}
}
$sample = new CreatePrimaryProductDataSourceMultipleLanguagesSample();
$sample->callSample();
Python
from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.shopping.merchant_datasources_v1 import CreateDataSourceRequest
from google.shopping.merchant_datasources_v1 import DataSource
from google.shopping.merchant_datasources_v1 import DataSourcesServiceClient
from google.shopping.merchant_datasources_v1 import PrimaryProductDataSource
_ACCOUNT = configuration.Configuration().read_merchant_info()
_PARENT = f"accounts/{_ACCOUNT}"
def create_primary_product_data_source_multiple_languages():
"""Creates a `DataSource` resource."""
# Gets OAuth Credentials.
credentials = generate_user_credentials.main()
# Creates a client.
client = DataSourcesServiceClient(credentials=credentials)
# Creates a PrimaryProductDataSource.
primary_datasource = PrimaryProductDataSource()
primary_datasource.countries = ["GB"]
# Creates a DataSource and populates its attributes.
data_source = DataSource()
data_source.display_name = "Example Multiple Languages Primary DataSource"
data_source.primary_product_data_source = primary_datasource
# Creates the request.
request = CreateDataSourceRequest(parent=_PARENT, data_source=data_source)
# Makes the request and catches and prints any error messages.
try:
response = client.create_data_source(request=request)
print(f"DataSource successfully created: {response}")
except RuntimeError as e:
print("DataSource creation failed")
print(e)
if __name__ == "__main__":
create_primary_product_data_source_multiple_languages()
cURL
curl -X POST \
"https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources" \
-H "Authorization: Bearer {API_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"displayName": "Primary Product Data Multiple Languages",
"primaryProductDataSource": {
"countries": ["GB"]
}
}'
Источник данных для определенного ярлыка и языка
Чтобы создать источник данных, который принимает только товары с определенным сочетанием ярлыка и языка, задайте поля feedLabel и contentLanguage с помощью метода dataSources.create:
POST https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources
{
"displayName": "My API Primary Product Source (US-en)",
"primaryProductDataSource": {
"feedLabel": "US",
"contentLanguage": "en",
"countries": ["US"]
}
}
При успешном выполнении запроса возвращается только что созданный ресурс DataSource. Вы можете использовать name нового источника данных, чтобы ссылаться на него при добавлении товаров с помощью Products sub-API.
{
"name": "accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}",
"dataSourceId": "{DATASOURCE_ID}",
"displayName": "My API Primary Product Source (US-en)",
"primaryProductDataSource": {
"feedLabel": "US",
"contentLanguage": "en",
"countries": ["US"]
},
"input": "API"
}
В примерах кода ниже показано, как создать источник данных, который принимает только товары с определенным сочетанием ярлыка и языка.
Java
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.datasources.v1.CreateDataSourceRequest;
import com.google.shopping.merchant.datasources.v1.DataSource;
import com.google.shopping.merchant.datasources.v1.DataSourcesServiceClient;
import com.google.shopping.merchant.datasources.v1.DataSourcesServiceSettings;
import com.google.shopping.merchant.datasources.v1.PrimaryProductDataSource;
import com.google.shopping.type.Destination.DestinationEnum;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/**
* This class demonstrates how to create a primary product datasource for the "en" and "GB"
* `feedLabel` and `contentLanguage` combination.
*/
public class CreatePrimaryProductDataSourceSample {
private static String getParent(String merchantId) {
return String.format("accounts/%s", merchantId);
}
public static String createDataSource(Config config, String displayName) throws Exception {
GoogleCredentials credential = new Authenticator().authenticate();
DataSourcesServiceSettings dataSourcesServiceSettings =
DataSourcesServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
String parent = getParent(config.getAccountId().toString());
// The type of data that this datasource will receive.
PrimaryProductDataSource primaryProductDataSource =
PrimaryProductDataSource.newBuilder()
.addCountries("GB")
.setContentLanguage("en")
.setFeedLabel("GB")
// The destinations do not necessarily have to be explicitly listed in which case the
// default enabled destinations will be used.
.addDestinations(
PrimaryProductDataSource.Destination.newBuilder()
.setDestination(DestinationEnum.FREE_LISTINGS)
.setState(PrimaryProductDataSource.Destination.State.ENABLED)
.build())
.addDestinations(
PrimaryProductDataSource.Destination.newBuilder()
.setDestination(DestinationEnum.SHOPPING_ADS)
.setState(PrimaryProductDataSource.Destination.State.DISABLED)
.build())
.build();
try (DataSourcesServiceClient dataSourcesServiceClient =
DataSourcesServiceClient.create(dataSourcesServiceSettings)) {
CreateDataSourceRequest request =
CreateDataSourceRequest.newBuilder()
.setParent(parent)
.setDataSource(
DataSource.newBuilder()
.setDisplayName(displayName)
.setPrimaryProductDataSource(primaryProductDataSource)
.build())
.build();
System.out.println("Sending Create PrimaryProduct DataSource request");
DataSource response = dataSourcesServiceClient.createDataSource(request);
System.out.println("Created DataSource Name below");
System.out.println(response.getName());
return response.getName();
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
// The displayed datasource name in the Merchant Center UI.
String displayName = "British Primary Product Data";
createDataSource(config, displayName);
}
}
PHP
use Google\ApiCore\ApiException;
use Google\Shopping\Merchant\DataSources\V1\Client\DataSourcesServiceClient;
use Google\Shopping\Merchant\DataSources\V1\CreateDataSourceRequest;
use Google\Shopping\Merchant\DataSources\V1\DataSource;
use Google\Shopping\Merchant\DataSources\V1\PrimaryProductDataSource;
use Google\Shopping\Type\Destination\DestinationEnum;
/**
* This class demonstrates how to create a primary product datasource for the "en" and "GB"
* `feedLabel` and `contentLanguage` combination.
*/
class CreatePrimaryProductDataSourceSample
{
/**
* A helper function to create the parent string for DataSource resources.
*
* @param string $accountId The Merchant Center account ID.
* @return string The parent resource name in the format `accounts/{account_id}`.
*/
private static function getParent(string $accountId): string
{
return sprintf("accounts/%s", $accountId);
}
/**
* Creates a new primary product data source.
*
* @param array $config The configuration array containing the account ID.
* @param string $displayName The display name for the new data source.
* @return void
*/
public static function createDataSourceSample(array $config, string $displayName): void
{
// Gets the OAuth credentials to make the request.
$credentials = Authentication::useServiceAccountOrTokenFile();
// Creates options config containing credentials for the client to use.
$options = ['credentials' => $credentials];
// Creates a DataSourcesServiceClient.
$dataSourcesServiceClient = new DataSourcesServiceClient($options);
// Constructs the parent resource name from the account ID.
$parent = self::getParent($config['accountId']);
// Defines the primary product data source specific settings.
$primaryProductDataSource = new PrimaryProductDataSource([
'countries' => ['GB'],
'content_language' => 'en',
'feed_label' => 'GB',
// The destinations do not necessarily have to be explicitly listed in which case the
// default enabled destinations will be used.
'destinations' => [
new PrimaryProductDataSource\Destination([
'destination' => DestinationEnum::FREE_LISTINGS,
'state' => PrimaryProductDataSource\Destination\State::ENABLED
]),
new PrimaryProductDataSource\Destination([
'destination' => DestinationEnum::SHOPPING_ADS,
'state' => PrimaryProductDataSource\Destination\State::DISABLED
])
]
]);
// Creates the DataSource object.
$dataSource = new DataSource([
'display_name' => $displayName,
'primary_product_data_source' => $primaryProductDataSource
]);
// Prepares the request message to create the data source.
$request = new CreateDataSourceRequest([
'parent' => $parent,
'data_source' => $dataSource
]);
// Calls the API and catches and prints any network failures/errors.
try {
print "Sending Create PrimaryProduct DataSource request\n";
// Issues the create data source request.
$response = $dataSourcesServiceClient->createDataSource($request);
print("Created DataSource below\n");
print($response->serializeToJsonString() . PHP_EOL);
} catch (ApiException $e) {
printf("ApiException was thrown: %s\n", $e->getMessage());
}
}
/**
* Helper to execute the sample.
*
* @return void
*/
public function callSample(): void
{
$config = Config::generateConfig();
// The displayed datasource name in the Merchant Center UI.
$displayName = "British Primary Product Data";
self::createDataSourceSample($config, $displayName);
}
}
// Run the script.
$sample = new CreatePrimaryProductDataSourceSample();
$sample->callSample();
Python
"""Sample for creating a primary product data source."""
from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.shopping.merchant_datasources_v1 import CreateDataSourceRequest
from google.shopping.merchant_datasources_v1 import DataSource
from google.shopping.merchant_datasources_v1 import DataSourcesServiceClient
from google.shopping.merchant_datasources_v1 import PrimaryProductDataSource
# Used for setting the destination type, e.g., FREE_LISTINGS.
from google.shopping.type import types as merchant_api_types
def create_primary_product_data_source(
account_id: str, display_name: str
) -> str:
"""Creates a primary product data source for the 'en' language and 'GB' region, targeting specific destinations.
Args:
account_id: The Merchant Center account ID.
display_name: The user-visible name for the new data source in Merchant
Center.
Returns:
The resource name of the newly created data source.
"""
# Obtains OAuth 2.0 credentials for API authentication.
credentials = generate_user_credentials.main()
# Initializes the DataSourcesServiceClient with the obtained credentials.
client = DataSourcesServiceClient(credentials=credentials)
# Configures the PrimaryProductDataSource.
# This section defines the core properties of the product data feed.
primary_product_data_source = PrimaryProductDataSource()
# Sets the target countries for this data source.
primary_product_data_source.countries = ["GB"]
# Sets the content language for the products.
primary_product_data_source.content_language = "en"
# Sets the feed label, often matching the country or language.
primary_product_data_source.feed_label = "GB"
# Defines the destinations for this data source and their states.
# If destinations are not explicitly listed, defaults will be used.
# Configure Free Listings destination (enabled).
destination_free_listings = PrimaryProductDataSource.Destination()
destination_free_listings.destination = (
merchant_api_types.Destination.DestinationEnum.FREE_LISTINGS
)
destination_free_listings.state = (
PrimaryProductDataSource.Destination.State.ENABLED
)
# Configure Shopping Ads destination (disabled).
destination_shopping_ads = PrimaryProductDataSource.Destination()
destination_shopping_ads.destination = (
merchant_api_types.Destination.DestinationEnum.SHOPPING_ADS
)
destination_shopping_ads.state = (
PrimaryProductDataSource.Destination.State.DISABLED
)
primary_product_data_source.destinations = [
destination_free_listings,
destination_shopping_ads,
]
# Assembles the DataSource object.
data_source = DataSource()
data_source.display_name = display_name
data_source.primary_product_data_source = primary_product_data_source
# Constructs the parent resource name format for Data Source operations.
parent = f"accounts/{account_id}"
# Prepares the CreateDataSourceRequest.
# This request includes the parent account and the data source configuration.
request = CreateDataSourceRequest(parent=parent, data_source=data_source)
try:
# Executes the API call to create the data source.
print("Sending Create PrimaryProduct DataSource request")
response = client.create_data_source(request=request)
# Confirms creation and prints the new data source's name.
print("Created DataSource Name below")
print(response)
return response.name
except RuntimeError as e:
# Handles any errors encountered during the API request.
print(e)
raise
if __name__ == "__main__":
# Fetches the Merchant Center account ID from the configuration file.
# This ID is essential for constructing the 'parent' resource path
# required by the API.
merchant_account_id = configuration.Configuration().read_merchant_info()
# Sets the desired display name for the data source in Merchant Center.
datasource_display_name = "British Primary Product Data"
# Calls the function to create the data source.
create_primary_product_data_source(
merchant_account_id, datasource_display_name
)
cURL
curl -X POST \
"https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources" \
-H "Authorization: Bearer {API_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"displayName": "British Primary Product Data",
"primaryProductDataSource": {
"countries": ["GB"],
"contentLanguage": "en",
"feedLabel": "GB",
"destinations": [
{
"destination": "FREE_LISTINGS",
"state": "ENABLED"
},
{
"destination": "SHOPPING_ADS",
"state": "DISABLED"
}
]
}
}'
Как создать дополнительный источник данных API и связать его с основным источником данных
Дополнительные источники данных позволяют добавлять сведения о товарах, которых нет в основных источниках.
Шаг 1. Создайте дополнительный источник данных API
Создайте дополнительный источник данных с помощью dataSources.create.
Если вы хотите, чтобы дополнительный источник данных можно было использовать с любым основным источником, не указывайте атрибуты feedLabel и contentLanguage. Чтобы настроить таргетинг на основные источники данных с соответствующими конфигурациями, укажите feedLabel и contentLanguage.
Рекомендации по дополнительным источникам данных
- Поддержка любых ярлыков и языков. Вы можете создавать дополнительные источники данных для любых ярлыков и языков или для определенных.
- Гибкость связывания. Основной источник данных можно связать с дополнительными источниками данных, независимо от того, предназначен ли основной источник данных для определенного ярлыка и языка или нет. Обратите внимание, что дополнительные источники данных не таргетируются на ярлыки или языки. Сопоставление выполняется во время обработки на основе значений атрибутов
feedLabelиcontentLanguage. - Сохраните названия источников данных. После создания дополнительных источников данных сохраните их названия в локальной базе данных, чтобы ссылаться на них в будущих вызовах API.
POST https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources
{
"displayName": "My API Supplemental Source",
"supplementalProductDataSource": {}
}
Будет возвращен только что созданный дополнительный ресурс DataSource. Запишите его name (включая dataSourceId).
{
"name": "accounts/{ACCOUNT_ID}/dataSources/{SUPPLEMENTAL_DATASOURCE_ID}",
"dataSourceId": "{SUPPLEMENTAL_DATASOURCE_ID}",
"displayName": "My API Supplemental Source",
"supplementalProductDataSource": {},
"input": "API"
}
В примерах кода ниже показано, как создать дополнительный источник данных о товарах, не задавая поля feedLabel и contentLanguage.
Java
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.datasources.v1.CreateDataSourceRequest;
import com.google.shopping.merchant.datasources.v1.DataSource;
import com.google.shopping.merchant.datasources.v1.DataSourcesServiceClient;
import com.google.shopping.merchant.datasources.v1.DataSourcesServiceSettings;
import com.google.shopping.merchant.datasources.v1.SupplementalProductDataSource;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/**
* This class demonstrates how to create a Supplemental product datasource all `feedLabel` and
* `contentLanguage` combinations. This works only for API supplemental feeds.
*/
public class CreateSupplementalProductDataSourceMultipleLanguagesSample {
private static String getParent(String merchantId) {
return String.format("accounts/%s", merchantId);
}
public static String createDataSource(Config config, String displayName) throws Exception {
GoogleCredentials credential = new Authenticator().authenticate();
DataSourcesServiceSettings dataSourcesServiceSettings =
DataSourcesServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
String parent = getParent(config.getAccountId().toString());
try (DataSourcesServiceClient dataSourcesServiceClient =
DataSourcesServiceClient.create(dataSourcesServiceSettings)) {
CreateDataSourceRequest request =
CreateDataSourceRequest.newBuilder()
.setParent(parent)
.setDataSource(
DataSource.newBuilder()
.setDisplayName(displayName)
.setSupplementalProductDataSource(
SupplementalProductDataSource.newBuilder().build())
.build())
.build();
System.out.println("Sending create SupplementalProduct DataSource request");
DataSource response = dataSourcesServiceClient.createDataSource(request);
System.out.println("Created DataSource Name below");
System.out.println(response.getName());
return response.getName();
} catch (Exception e) {
System.out.println(e);
System.exit(1);
return null; // Necessary to satisfy the compiler as we're not returning a
// String on failure.
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
// The displayed data source name in the Merchant Center UI.
String displayName = "Supplemental API Product Data Multiple Languages";
createDataSource(config, displayName);
}
}
PHP
use Google\ApiCore\ApiException;
use Google\Shopping\Merchant\DataSources\V1\Client\DataSourcesServiceClient;
use Google\Shopping\Merchant\DataSources\V1\CreateDataSourceRequest;
use Google\Shopping\Merchant\DataSources\V1\DataSource;
use Google\Shopping\Merchant\DataSources\V1\SupplementalProductDataSource;
/**
* Class to demonstrate creating a Supplemental product datasource for all
* `feedLabel` and `contentLanguage` combinations. This works only for API
* supplemental feeds.
*/
class CreateSupplementalProductDataSourceMultipleLanguagesSample
{
/**
* Creates a DataSource.
*
* @param int $merchantId The Merchant Center Account ID.
* @param string $displayName The display name of the data source.
* @return string The name of the newly created data source.
*/
public function createDataSource(int $merchantId, string $displayName): string
{
// Gets the OAuth credentials to make the request.
$credentials = Authentication::useServiceAccountOrTokenFile();
// Creates options config containing credentials for the client to use.
$options = ['credentials' => $credentials];
// Creates a client.
$dataSourcesServiceClient = new DataSourcesServiceClient($options);
$parent = sprintf('accounts/%s', $merchantId);
// Creates the data source.
$dataSource = (new DataSource())
->setDisplayName($displayName)
->setSupplementalProductDataSource(new SupplementalProductDataSource());
// Creates the request.
$request = (new CreateDataSourceRequest())
->setParent($parent)
->setDataSource($dataSource);
print('Sending create SupplementalProduct DataSource request' . PHP_EOL);
// Calls the API and catches and prints any network failures/errors.
try {
$response = $dataSourcesServiceClient->createDataSource($request);
print('Created DataSource Name below' . PHP_EOL);
print($response->getName() . PHP_EOL);
return $response->getName();
} catch (ApiException $ex) {
print('Call failed with message: ' . $ex->getMessage() . PHP_EOL);
return '';
}
}
// Helper to execute the sample.
public function callSample(): void
{
$config = Config::generateConfig();
// The Merchant Center Account ID.
$merchantId = $config['accountId'];
// The displayed datasource name in the Merchant Center UI.
$displayName = 'Supplemental API Product Data Multiple Languages';
self::createDataSource($merchantId, $displayName);
}
}
$sample = new CreateSupplementalProductDataSourceMultipleLanguagesSample();
$sample->callSample();
Python
from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.shopping import merchant_datasources_v1
_ACCOUNT = configuration.Configuration().read_merchant_info()
_PARENT = f"accounts/{_ACCOUNT}"
def create_supplemental_product_data_source_multiple_languages():
"""Creates a `DataSource` resource."""
# Gets OAuth Credentials.
credentials = generate_user_credentials.main()
# Creates a client.
client = merchant_datasources_v1.DataSourcesServiceClient(
credentials=credentials
)
# Creates a SupplementalProductDataSource.
supplemental_datasource = (
merchant_datasources_v1.SupplementalProductDataSource()
)
# Creates a DataSource and populates its attributes.
data_source = merchant_datasources_v1.DataSource()
data_source.display_name = (
"Example Multiple Languages Supplemental DataSource"
)
data_source.supplemental_product_data_source = supplemental_datasource
# Creates the request.
request = merchant_datasources_v1.CreateDataSourceRequest(
parent=_PARENT, data_source=data_source
)
# Makes the request and catches and prints any error messages.
try:
response = client.create_data_source(request=request)
print(f"DataSource successfully created: {response}")
except RuntimeError as e:
print("DataSource creation failed")
print(e)
if __name__ == "__main__":
create_supplemental_product_data_source_multiple_languages()
cURL
curl -X POST \
"https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources" \
-H "Authorization: Bearer {API_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"displayName": "Supplemental API Product Data Multiple Languages",
"supplementalProductDataSource": {}
}'
Шаг 2. Свяжите дополнительный источник данных с основным
Обновите основной источник данных, чтобы связать его с новым дополнительным источником. Для этого измените свойство defaultRule объекта PrimaryProductDataSource с помощью метода dataSources.patch.
Список takeFromDataSources в defaultRule определяет порядок приоритета. Атрибуты берутся из первого источника данных в списке, который их предоставляет. Сокращение self указывает на сам основной источник данных.
В примерах ниже показано правило по умолчанию, согласно которому данные сначала берутся из основного источника данных, а если атрибут там недоступен, то из дополнительного.
PATCH https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources/{PRIMARY_DATASOURCE_ID}?updateMask=primaryProductDataSource.defaultRule
{
"name": "accounts/{ACCOUNT_ID}/dataSources/{PRIMARY_DATASOURCE_ID}",
"primaryProductDataSource": {
"defaultRule": {
"takeFromDataSources": [
{
"self": true
},
{
"supplementalDataSourceName": "accounts/{ACCOUNT_ID}/dataSources/{SUPPLEMENTAL_DATASOURCE_ID}"
}
]
}
}
}
При успешном выполнении запроса возвращается обновленный основной ресурс DataSource.
{
"name": "accounts/{ACCOUNT_ID}/dataSources/{PRIMARY_DATASOURCE_ID}",
"dataSourceId": "{PRIMARY_DATASOURCE_ID}",
"displayName": "My API Primary Product Source",
"primaryProductDataSource": {
"countries": [
"US",
"GB",
"DE"
],
"defaultRule": {
"takeFromDataSources": [
{
"self": true
},
{
"supplementalDataSourceName": "accounts/{ACCOUNT_ID}/dataSources/{SUPPLEMENTAL_DATASOURCE_ID}"
}
]
}
},
"input": "API"
}
В примерах кода ниже показано, как подключить дополнительный источник данных к основному.
Java
import shopping.merchant.samples.datasources.v1.UpdateDataSourceSample;
import shopping.merchant.samples.utils.Config;
/**
* This class demonstrates how to add supplemental DataSources to the primary DataSource's default
* rule.
*/
public class AddSupplementalDataSourceToPrimaryDataSourceSample {
public static void addSupplementalDataSourceToPrimaryDataSource(
Config config,
String primaryDataSourceName,
String firstSupplementalDataSourceName,
String secondSupplementalDataSourceName)
throws Exception {
// Update the primary DataSource's default rule to include both supplemental feeds.
UpdateDataSourceSample updateDatasource = new UpdateDataSourceSample();
updateDatasource.updateDataSource(
config,
primaryDataSourceName,
firstSupplementalDataSourceName,
secondSupplementalDataSourceName);
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
// The names of the primary and supplemental datasources.
String primaryDataSourceName = "accounts/{account_id}/dataSources/{datasource_id}";
String firstSupplementalDataSourceName = "accounts/{account_id}/dataSources/{datasource_id}";
String secondSupplementalDataSourceName = "accounts/{account_id}/dataSources/{datasource_id}";
addSupplementalDataSourceToPrimaryDataSource(
config,
primaryDataSourceName,
firstSupplementalDataSourceName,
secondSupplementalDataSourceName);
}
}
cURL
curl -X PATCH \
"https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources/{PRIMARY_DATASOURCE_ID}?updateMask=primaryProductDataSource.defaultRule" \
-H "Authorization: Bearer {API_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"name": "accounts/{ACCOUNT_ID}/dataSources/{PRIMARY_DATASOURCE_ID}",
"primaryProductDataSource": {
"defaultRule": {
"takeFromDataSources": [
{
"self": true
},
{
"supplementalDataSourceName": "accounts/{ACCOUNT_ID}/dataSources/{SUPPLEMENTAL_DATASOURCE_ID_1}"
},
{
"supplementalDataSourceName": "accounts/{ACCOUNT_ID}/dataSources/{SUPPLEMENTAL_DATASOURCE_ID_2}"
}
]
}
}
}'
Как обновить источник данных
Вы можете изменить свойства существующего источника данных, например displayName.
Используйте метод dataSources.patch и укажите поля, которые нужно обновить, в updateMask.
PATCH https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}?updateMask=displayName
{
"name": "accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}",
"displayName": "Updated API Primary Source Name"
}
При успешном выполнении запроса возвращается обновленный ресурс DataSource.
{
"name": "accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}",
"dataSourceId": "{DATASOURCE_ID}",
"displayName": "Updated API Primary Source Name",
"primaryProductDataSource": {
"feedLabel": "US",
"contentLanguage": "en",
"countries": ["US"]
},
"input": "API"
}
В примерах кода ниже показано, как использовать метод patch для обновления источника данных.
Java
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.protobuf.FieldMask;
import com.google.shopping.merchant.datasources.v1.DataSource;
import com.google.shopping.merchant.datasources.v1.DataSourceName;
import com.google.shopping.merchant.datasources.v1.DataSourceReference;
import com.google.shopping.merchant.datasources.v1.DataSourcesServiceClient;
import com.google.shopping.merchant.datasources.v1.DataSourcesServiceSettings;
import com.google.shopping.merchant.datasources.v1.PrimaryProductDataSource;
import com.google.shopping.merchant.datasources.v1.PrimaryProductDataSource.DefaultRule;
import com.google.shopping.merchant.datasources.v1.UpdateDataSourceRequest;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/**
* This class demonstrates how to update a datasource to change its name in the MC UI. It also
* demonstrates how to update a primary datasource to add supplemental datasources to its default
* rule (https://support.google.com/merchants/answer/7450276).
*/
public class UpdateDataSourceSample {
public static String updateDataSource(Config config, String displayName, String dataSourceId)
throws Exception {
GoogleCredentials credential = new Authenticator().authenticate();
DataSourcesServiceSettings dataSourcesServiceSettings =
DataSourcesServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Creates datasource name to identify datasource.
String name =
DataSourceName.newBuilder()
.setAccount(config.getAccountId().toString())
.setDatasource(dataSourceId)
.build()
.toString();
DataSource dataSource =
DataSource.newBuilder()
// Update the datasource to have the new display name
.setDisplayName(displayName)
.setName(name)
.build();
FieldMask fieldMask = FieldMask.newBuilder().addPaths("display_name").build();
try (DataSourcesServiceClient dataSourcesServiceClient =
DataSourcesServiceClient.create(dataSourcesServiceSettings)) {
UpdateDataSourceRequest request =
UpdateDataSourceRequest.newBuilder()
.setDataSource(dataSource)
.setUpdateMask(fieldMask)
.build();
System.out.println("Sending Update DataSource request");
DataSource response = dataSourcesServiceClient.updateDataSource(request);
System.out.println("Updated DataSource Name below");
System.out.println(response.getName());
return response.getName();
} catch (Exception e) {
System.out.println(e);
System.exit(1);
return null;
}
}
public String updateDataSource(
Config config,
String primaryDataSourceName,
String firstSupplementalDataSourceName,
String secondSupplementalDataSourceName)
throws Exception {
GoogleCredentials credential = new Authenticator().authenticate();
DataSourcesServiceSettings dataSourcesServiceSettings =
DataSourcesServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Setting self to 'true' refers to the primary datasource itself.
DataSourceReference dataSourceReferenceSelf =
DataSourceReference.newBuilder().setSelf(true).build();
DataSourceReference firstSupplementalDataSourceReference =
DataSourceReference.newBuilder()
.setSupplementalDataSourceName(firstSupplementalDataSourceName)
.build();
DataSourceReference secondSupplementalDataSourceReference =
DataSourceReference.newBuilder()
.setSupplementalDataSourceName(secondSupplementalDataSourceName)
.build();
// The attributes will first be taken from the primary DataSource.
// Then the first supplemental DataSource if the attribute is not in the primary DataSource
// And finally the second supplemental DataSource if not in the first two DataSources.
// Note that CustomRules could change the behavior of how updates are applied.
DefaultRule defaultRule =
DefaultRule.newBuilder()
.addTakeFromDataSources(dataSourceReferenceSelf)
.addTakeFromDataSources(firstSupplementalDataSourceReference)
.addTakeFromDataSources(secondSupplementalDataSourceReference)
.build();
// The type of data that this datasource will receive.
PrimaryProductDataSource primaryProductDataSource =
PrimaryProductDataSource.newBuilder().setDefaultRule(defaultRule).build();
DataSource dataSource =
DataSource.newBuilder()
// Update the primary datasource to have the default rule datasources in the correct
// order.
.setPrimaryProductDataSource(primaryProductDataSource)
.setName(primaryDataSourceName)
.build();
// The '.' signifies a nested field.
FieldMask fieldMask =
FieldMask.newBuilder().addPaths("primary_product_data_source.default_rule").build();
try (DataSourcesServiceClient dataSourcesServiceClient =
DataSourcesServiceClient.create(dataSourcesServiceSettings)) {
UpdateDataSourceRequest request =
UpdateDataSourceRequest.newBuilder()
.setDataSource(dataSource)
.setUpdateMask(fieldMask)
.build();
System.out.println("Sending Update DataSource request");
DataSource response = dataSourcesServiceClient.updateDataSource(request);
System.out.println("Updated DataSource Name below");
System.out.println(response.getName());
return response.getName();
} catch (Exception e) {
System.out.println(e);
System.exit(1);
return null;
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
// The updated displayed datasource name in the Merchant Center UI.
String displayName = "Great Britain Primary Product Data";
// The ID of the datasource to update
String dataSourceId = "11111111"; // Replace with your datasource ID.
updateDataSource(config, displayName, dataSourceId);
}
}
PHP
use Google\ApiCore\ApiException;
use Google\Protobuf\FieldMask;
use Google\Shopping\Merchant\DataSources\V1\Client\DataSourcesServiceClient;
use Google\Shopping\Merchant\DataSources\V1\DataSource;
use Google\Shopping\Merchant\DataSources\V1\UpdateDataSourceRequest;
/**
* Class to demonstrate updating a datasource to change its name in the MC UI.
*/
class UpdateDataSourceSample
{
// ENSURE you fill in the datasource ID for the sample to work.
private const DATASOURCE_ID = 'INSERT_DATASOURCE_ID';
/**
* Updates a DataSource.
*
* @param int $merchantId The Merchant Center Account ID.
* @param string $displayName The new display name of the data source.
* @param string $dataSourceId The data source ID.
* @return string The name of the updated data source.
*/
public function updateDataSource(int $merchantId, string $displayName, string $dataSourceId): string
{
// Gets the OAuth credentials to make the request.
$credentials = Authentication::useServiceAccountOrTokenFile();
// Creates options config containing credentials for the client to use.
$options = ['credentials' => $credentials];
// Creates a client.
$dataSourcesServiceClient = new DataSourcesServiceClient($options);
// Creates the data source name.
$name = sprintf('accounts/%s/dataSources/%s', $merchantId, $dataSourceId);
// Creates the data source.
$dataSource = (new DataSource())
->setDisplayName($displayName)
->setName($name);
// Creates a FieldMask to specify which fields to update.
$updateMask = new FieldMask([
'paths' => ['display_name']
]);
// Creates the request.
$request = (new UpdateDataSourceRequest())
->setDataSource($dataSource)
->setUpdateMask($updateMask);
print('Sending Update DataSource request' . PHP_EOL);
// Calls the API and catches and prints any network failures/errors.
try {
$response = $dataSourcesServiceClient->updateDataSource($request);
print('Updated DataSource Name below' . PHP_EOL);
print($response->getName() . PHP_EOL);
return $response->getName();
} catch (ApiException $ex) {
print('Call failed with message: ' . $ex->getMessage() . PHP_EOL);
return '';
}
}
// Helper to execute the sample.
public function callSample(): void
{
$config = Config::generateConfig();
// The Merchant Center Account ID.
$merchantId = $config['accountId'];
// The updated displayed datasource name in the Merchant Center UI.
$displayName = 'new name';
self::updateDataSource($merchantId, $displayName, self::DATASOURCE_ID);
}
}
$sample = new UpdateDataSourceSample();
$sample->callSample();
Python
from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.protobuf import field_mask_pb2
from google.shopping import merchant_datasources_v1
# ENSURE you fill in the datasource ID for the sample to
# work.
_ACCOUNT = configuration.Configuration().read_merchant_info()
# An ID automatically assigned to the datasource after creation by Google.
_DATASOURCE = "[INSERT_DATASOURCE_HERE]"
_NAME = f"accounts/{_ACCOUNT}/dataSources/{_DATASOURCE}"
def update_data_source():
"""Updates the specified `DataSource` resource."""
# Gets OAuth Credentials.
credentials = generate_user_credentials.main()
# Creates a client.
client = merchant_datasources_v1.DataSourcesServiceClient(
credentials=credentials
)
# Creates a DataSource and populates its attributes.
data_source = merchant_datasources_v1.DataSource()
data_source.name = _NAME # To identify the data source to update.
data_source.display_name = "Example DataSource 2"
# Sets field mask to include only the fields you want to update.
field_mask = field_mask_pb2.FieldMask(paths=["display_name"])
# Creates the request.
request = merchant_datasources_v1.UpdateDataSourceRequest(
data_source=data_source, update_mask=field_mask
)
# Makes the request and catch and print any error messages.
try:
client.update_data_source(request=request)
print("Update successful")
except RuntimeError as e:
print("Update failed")
print(e)
if __name__ == "__main__":
update_data_source()
cURL
curl -X PATCH \
"https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}?updateMask=displayName" \
-H "Authorization: Bearer {API_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"name": "accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}",
"displayName": "Updated API Primary Source Name"
}'
Как удалить источник данных
Чтобы удалить источник данных из аккаунта Merchant Center, используйте метод dataSources.delete. Если дополнительный источник данных связан с основным, то удалить его можно, только убрав все связи.
DELETE https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}
В случае успешного удаления возвращается пустой ответ.
В примерах кода ниже показано, как использовать метод delete для удаления источника данных.
Java
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.datasources.v1.DataSourceName;
import com.google.shopping.merchant.datasources.v1.DataSourcesServiceClient;
import com.google.shopping.merchant.datasources.v1.DataSourcesServiceSettings;
import com.google.shopping.merchant.datasources.v1.DeleteDataSourceRequest;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/** This class demonstrates how to delete a datasource. */
public class DeleteDataSourceSample {
public static void deleteDataSource(Config config, String dataSourceId) throws Exception {
GoogleCredentials credential = new Authenticator().authenticate();
DataSourcesServiceSettings dataSourcesServiceSettings =
DataSourcesServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
String name =
DataSourceName.newBuilder()
.setAccount(config.getAccountId().toString())
.setDatasource(dataSourceId)
.build()
.toString();
try (DataSourcesServiceClient dataSourcesServiceClient =
DataSourcesServiceClient.create(dataSourcesServiceSettings)) {
DeleteDataSourceRequest request = DeleteDataSourceRequest.newBuilder().setName(name).build();
System.out.println("Sending deleteDataSource request");
// Delete works for any datasource type.
// If Type "Supplemental", delete will only work if it's not linked to any primary feed.
// If a link exists and the Type is "Supplemental", you will need to remove the supplemental
// feed from the default and/or custom rule(s) of any primary feed(s) that references it. Then
// retry the delete.
dataSourcesServiceClient.deleteDataSource(request); // No response returned on success.
System.out.println(
"Delete successful, note that it may take a few minutes for the delete to update in"
+ " the system.");
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
// An ID automatically assigned to the datasource after creation by Google.
String dataSourceId = "1111111111"; // Replace with your datasource ID.
deleteDataSource(config, dataSourceId);
}
}
PHP
use Google\ApiCore\ApiException;
use Google\Shopping\Merchant\DataSources\V1\Client\DataSourcesServiceClient;
use Google\Shopping\Merchant\DataSources\V1\DeleteDataSourceRequest;
/**
* Class to demonstrate deleting a datasource.
*/
class DeleteDataSourceSample
{
// ENSURE you fill in the datasource ID for the sample to work.
private const DATASOURCE_ID = 'INSERT_DATASOURCE_ID';
/**
* Deletes a DataSource.
*
* @param int $merchantId The Merchant Center Account ID.
* @param string $dataSourceId The data source ID.
*/
public function deleteDataSource(int $merchantId, string $dataSourceId): void
{
// Gets the OAuth credentials to make the request.
$credentials = Authentication::useServiceAccountOrTokenFile();
// Creates options config containing credentials for the client to use.
$options = ['credentials' => $credentials];
// Creates a client.
$dataSourcesServiceClient = new DataSourcesServiceClient($options);
// Creates the data source name.
$name = sprintf('accounts/%s/dataSources/%s', $merchantId, $dataSourceId);
// Creates the request.
$request = (new DeleteDataSourceRequest())
->setName($name);
print('Sending deleteDataSource request' . PHP_EOL);
// Calls the API and catches and prints any network failures/errors.
try {
$dataSourcesServiceClient->deleteDataSource($request);
print('Delete successful, note that it may take a few minutes for the delete to update in the system.' . PHP_EOL);
} catch (ApiException $ex) {
print('Call failed with message: ' . $ex->getMessage() . PHP_EOL);
}
}
// Helper to execute the sample.
public function callSample(): void
{
$config = Config::generateConfig();
// The Merchant Center Account ID.
$merchantId = $config['accountId'];
self::deleteDataSource($merchantId, self::DATASOURCE_ID);
}
}
$sample = new DeleteDataSourceSample();
$sample->callSample();
Python
from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.shopping import merchant_datasources_v1
def delete_data_source(account_id: str, datasource_id: str):
"""Deletes the specified `DataSource` resource.
Delete works for any datasource type.
If Type "Supplemental", delete will only work if it's not linked to any
primary feed. If a link exists and the Type is "Supplemental", you will need
to remove the supplemental feed from the default and/or custom rule(s) of any
primary feed(s) that references it. Then retry the delete.
Args:
account_id: The Merchant Center account ID.
datasource_id: The ID of the data source to delete.
"""
# Gets OAuth Credentials.
credentials = generate_user_credentials.main()
# Creates a client.
client = merchant_datasources_v1.DataSourcesServiceClient(
credentials=credentials
)
name = f"accounts/{account_id}/dataSources/{datasource_id}"
# Creates the request.
request = merchant_datasources_v1.DeleteDataSourceRequest(name=name)
# Makes the request and catches and prints any error messages.
try:
# No response is returned on request.
client.delete_data_source(request=request)
print("Deletion successful")
except RuntimeError as e:
print("Deletion failed")
print(e)
raise
if __name__ == "__main__":
# Retrieves the Merchant Center account ID from the configuration file.
merchant_account_id = configuration.Configuration().read_merchant_info()
# ENSURE you fill in the datasource ID for the sample to
# work.
# An ID automatically assigned to the datasource after creation by Google.
target_datasource = "[INSERT_DATASOURCE_HERE]"
delete_data_source(merchant_account_id, target_datasource)
cURL
curl -X DELETE \
"https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}" \
-H "Authorization: Bearer {API_TOKEN}" \