Puoi utilizzare questa guida per eseguire la migrazione dell'implementazione esistente dell'API Content for Shopping all'API Merchant. Per ulteriori informazioni sui dettagli dell'API Merchant e delle relative API secondarie, consulta Design dell'API Merchant.
Inizia
Per iniziare a utilizzare l'API Merchant, modifica gli URL delle richieste nel seguente formato:
https://merchantapi.googleapis.com/{SUB_API}/{VERSION}/{RESOURCE_NAME}:{METHOD}…
Per ulteriori informazioni, consulta la guida rapida e il riferimento dell'API Merchant.
Miglioramenti rispetto all'API Content
L'API Merchant ti consente di automatizzare e semplificare i flussi di lavoro in Merchant Center e offre funzionalità avanzate rispetto all'API Content.
Casi d'uso principali:
- Gestione automatica dell'account
- Gestione automatica dei prodotti
- Gestione automatica dell'inventario
- Rapporti personalizzati
Aree di miglioramento principali:
- API secondarie con nuove funzionalità per la tua integrazione unica
- Nuovi metodi per inventario, dati di prodotto e altre API
- La possibilità di creare non solo origini dati principali, ma più origini dati come:
- Viene introdotto il caricamento delle recensioni prodotto e delle recensioni del commerciante
- Con l'API Merchant, puoi attivare le notifiche per le modifiche ai dati dell'account.
Supporto gRPC
L'API Merchant supporta gRPC e REST. Puoi utilizzare contemporaneamente gRPC per l'API Merchant e REST per l'API Content for Shopping.
Le librerie client dell'API Merchant richiedono gRPC.
Per ulteriori informazioni, consulta la panoramica di gRPC.
Compatibilità
Questa guida descrive le modifiche generali che si applicano all'intera API Merchant.
L'API Merchant è progettata per funzionare insieme alle funzionalità esistenti dell'API Content for Shopping v2.1.
Ad esempio, puoi utilizzare l'API Merchant Inventories insieme all'implementazione esistente della v2.1 della
products
API Content for Shopping. Puoi utilizzare l'API Content for Shopping per caricare un nuovo prodotto locale (che vendi in un negozio locale) e poi utilizzare la risorsa API Merchant Inventories
LocalInventory
per gestire le informazioni in negozio per quel prodotto.
Richieste batch
L'API Merchant non supporta il metodo
customBatch
presente nell'API Content for Shopping. Leggi invece l'articolo Inviare più richieste contemporaneamente o esegui le chiamate in modo asincrono.
L'esempio seguente mostra come inserire input di prodotto in modo asincrono.
Java
import com.google.api.core.ApiFuture;
import com.google.api.core.ApiFutureCallback;
import com.google.api.core.ApiFutures;
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.shopping.merchant.products.v1beta.Attributes;
import com.google.shopping.merchant.products.v1beta.InsertProductInputRequest;
import com.google.shopping.merchant.products.v1beta.ProductInput;
import com.google.shopping.merchant.products.v1beta.ProductInputsServiceClient;
import com.google.shopping.merchant.products.v1beta.ProductInputsServiceSettings;
import com.google.shopping.merchant.products.v1beta.Shipping;
import com.google.shopping.type.Channel.ChannelEnum;
import com.google.shopping.type.Price;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/** This class demonstrates how to insert a product input */
public class InsertProductInputAsyncSample {
private static String getParent(String accountId) {
return String.format("accounts/%s", accountId);
}
private static String generateRandomString() {
String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
Random random = new Random();
StringBuilder sb = new StringBuilder(8);
for (int i = 0; i < 8; i++) {
sb.append(characters.charAt(random.nextInt(characters.length())));
}
return sb.toString();
}
private static ProductInput createRandomProduct() {
Price price = Price.newBuilder().setAmountMicros(33_450_000).setCurrencyCode("USD").build();
Shipping shipping =
Shipping.newBuilder().setPrice(price).setCountry("GB").setService("1st class post").build();
Shipping shipping2 =
Shipping.newBuilder().setPrice(price).setCountry("FR").setService("1st class post").build();
Attributes attributes =
Attributes.newBuilder()
.setTitle("A Tale of Two Cities")
.setDescription("A classic novel about the French Revolution")
.setLink("https://exampleWebsite.com/tale-of-two-cities.html")
.setImageLink("https://exampleWebsite.com/tale-of-two-cities.jpg")
.setAvailability("in stock")
.setCondition("new")
.setGoogleProductCategory("Media > Books")
.addGtin("9780007350896")
.addShipping(shipping)
.addShipping(shipping2)
.build();
return ProductInput.newBuilder()
.setChannel(ChannelEnum.ONLINE)
.setContentLanguage("en")
.setFeedLabel("CH")
.setOfferId(generateRandomString())
.setAttributes(attributes)
.build();
}
public static void asyncInsertProductInput(Config config, String dataSource) throws Exception {
// Obtains OAuth token based on the user's configuration.
GoogleCredentials credential = new Authenticator().authenticate();
// Creates service settings using the credentials retrieved above.
ProductInputsServiceSettings productInputsServiceSettings =
ProductInputsServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Creates parent to identify where to insert the product.
String parent = getParent(config.getAccountId().toString());
// Calls the API and catches and prints any network failures/errors.
try (ProductInputsServiceClient productInputsServiceClient =
ProductInputsServiceClient.create(productInputsServiceSettings)) {
// Creates five insert product input requests with random product IDs.
List<InsertProductInputRequest> requests = new ArrayList<>(5);
for (int i = 0; i < 5; i++) {
InsertProductInputRequest request =
InsertProductInputRequest.newBuilder()
.setParent(parent)
// You can only insert products into datasource types of Input "API", and of Type
// "Primary" or "Supplemental."
// This field takes the `name` field of the datasource.
.setDataSource(dataSource)
// If this product is already owned by another datasource, when re-inserting, the
// new datasource will take ownership of the product.
.setProductInput(createRandomProduct())
.build();
requests.add(request);
}
System.out.println("Sending insert product input requests");
List<ApiFuture<ProductInput>> futures =
requests.stream()
.map(
request ->
productInputsServiceClient.insertProductInputCallable().futureCall(request))
.collect(Collectors.toList());
// Creates callback to handle the responses when all are ready.
ApiFuture<List<ProductInput>> responses = ApiFutures.allAsList(futures);
ApiFutures.addCallback(
responses,
new ApiFutureCallback<List<ProductInput>>() {
@Override
public void onSuccess(List<ProductInput> results) {
System.out.println("Inserted products below");
System.out.println(results);
}
@Override
public void onFailure(Throwable throwable) {
System.out.println(throwable);
}
},
MoreExecutors.directExecutor());
} catch (Exception e) {
System.out.println(e);
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
// Identifies the data source that will own the product input.
String dataSource = "accounts/" + config.getAccountId() + "/dataSources/{datasourceId}";
asyncInsertProductInput(config, dataSource);
}
}
Se utilizzi
customBatch
nell'
API Content e hai bisogno di questa funzionalità per l'API Merchant, facci sapere il motivo nel
feedback.
Identificatori
Per allinearci ai principi di miglioramento delle API di Google, abbiamo apportato alcune modifiche agli identificatori delle risorse dell'API Merchant.
L'utilizzo di IDENTIFIER
indica che un campo all'interno di un messaggio della risorsa viene utilizzato per identificare la risorsa. È associato al campo del nome, consulta i campi che rappresentano i nomi delle risorse.
Il valore IDENTIFIER
indica che il campo non è accettato come input
(ovvero OUTPUT_ONLY
) nel contesto di un metodo di creazione, ma viene anche
considerato IMMUTABLE
e accettato come input per i metodi di mutazione che
accettano la risorsa come esempio di input principale: Aggiornamento standard.
Il nome sostituisce l'ID
Tutte le risorse dell'API Merchant utilizzano il campo name
come identificatore univoco.
Ecco un esempio di come utilizzare il campo name
nelle chiamate:
GET https://merchantapi.googleapis.com/products/v1beta/accounts/4321/products/online~en~US~1234
dove name
è uguale a accounts/4321/products/online~en~US~1234
.
Questo nuovo campo name
viene restituito come identificatore della risorsa per tutte le chiamate di lettura
e scrittura nell'API Merchant.
Ad esempio, implementa un metodo getName()
per recuperare il name
da una
risorsa e memorizza l'output come variabile anziché creare autonomamente il name
dall'ID azienda e dalla risorsa.
Delimitatori
L'API Merchant utilizza i tilde anziché i due punti come delimitatori.
La tabella seguente mette a confronto l'ID prodotto per l'API Content e l'API Merchant:
API Content | API Merchant |
---|---|
channel:contentLanguage:feedLabel:offerId . Ad esempio, online:en:US:sku123 |
channel~contentLanguage~feedLabel~offerId . Ad esempio, online~en~US~sku123 |
campi parent per le risorse secondarie
Nell'API Merchant, tutte le risorse secondarie hanno il campo parent
. Puoi utilizzare il campo parent
per specificare il name
della risorsa in cui inserire la risorsa secondaria, anziché passare l'intera risorsa principale.
Puoi anche utilizzare il campo parent
con i metodi list
per elencare le risorse secondarie di parent
.
Ad esempio, per elencare gli inventari locali di un determinato prodotto, specifica il valore name
del prodotto nel campo parent
per il metodo list
. In questo caso, product
è il parent
delle risorse
LocalInventory
riportate.
GET https://merchantapi.googleapis.com/inventories/v1beta/{parent}/localInventories
Per recuperare tutti gli inventari locali per il prodotto online~en~US~1234
e l'account4321
, la richiesta sarà simile alla seguente:
GET https://merchantapi.googleapis.com/inventories/v1beta/accounts/4321/products/online~en~US~1234/localInventories
dove parent è uguale a accounts/{account}/products/{product}. Tieni presente che in questo caso gli inventari locali hanno due elementi principali inclusi nell'identificatore del nome (accounts/ e products/) perché l'account è l'elemento principale della risorsa prodotto.
Tipi comuni
Ecco alcuni tipi comuni condivisi tra le API secondarie dell'API Merchant.
Destination.DestinationEnum
Utilizza il campo Destination.DestinationEnum per controllare su quali piattaforme devono essere visualizzate le tue risorse. Il campo DestinationEnum
elenca tutti
i valori disponibili per il targeting per destinazione. Le API unificano DestinationEnum
in più sotto-API, ad esempio per gli attributi delle promozioni.
ReportingContext.ReportingContextEnum
Il campo ReportingContext.ReportingContextEnum rappresenta il contesto a cui si applicano i problemi relativi all'account e ai prodotti. Questo campo viene utilizzato in tutti i metodi di generazione di report (ad esempio per IssueSeverityPerReportingContext).
Prezzo
Ecco cosa è cambiato per Price
nel pacchetto Merchant Common:
API Content | API Merchant | |
---|---|---|
Campo dell'importo | value:string |
amountMicros:int64 |
Campo Valuta | currency:string
|
currencyCode:string |
L'importo in Price
viene ora registrato in micro, dove 1 milione di micro è equivalente all'unità standard della tua valuta.
Nell'API Content for Shopping, Price
era un numero decimale sotto forma di stringa.
Il nome del campo dell'importo è passato da value
a amountMicros
Il nome del campo valuta è passato da currency
a currencyCode
. Il formato rimane ISO 4217.