Kompatibilität der Content API für Shopping

In diesem Leitfaden erfahren Sie, wie Sie die Merchant API in Ihre bestehende Content API for Shopping-Implementierung einbinden.

Mit der Merchant API können Sie konto-, produkt- und inventarbezogene Verwaltungsabläufe im Merchant Center automatisieren. Anwendungsfälle für die Merchant API:

  • Automatische Kontenverwaltung
  • Automatisierte Produktverwaltung
  • Automatisierte Inventarverwaltung
  • Benutzerdefinierte Berichte

Verbesserungen gegenüber der Content API

Die Merchant API bietet in den folgenden Bereichen Vorteile gegenüber der Content API:

Jetzt starten

Weitere Informationen zur Merchant API und ihren untergeordneten APIs finden Sie im Design der Merchant API.

Wenn Sie die Merchant API verwenden möchten, ändern Sie Ihre Anfrage-URLs in das folgende Format:

https://merchantapi.googleapis.com/{SUB_API}/{VERSION}/{RESOURCE_NAME}:{METHOD}

Weitere Informationen finden Sie in der Kurzanleitung und in der Referenz zur Merchant API.

gRPC-Unterstützung

Die Merchant API unterstützt gRPC und REST. Sie können gleichzeitig gRPC für die Merchant API und REST für die Content API for Shopping verwenden.

Für die Clientbibliotheken der Merchant API ist gRPC erforderlich.

Weitere Informationen finden Sie unter gRPC verwenden.

Kompatibilität

In diesem Leitfaden werden allgemeine Änderungen beschrieben, die für die gesamte Merchant API gelten. Informationen zu Änderungen an bestimmten Funktionen finden Sie in den folgenden Leitfäden:

Die Merchant API ist für die Verwendung mit den vorhandenen Funktionen der Content API for Shopping Version 2.1 konzipiert.

Sie können die Merchant Inventories API beispielsweise zusammen mit Ihrer vorhandenen Implementierung der Content API for Shopping 2.1 products verwenden. Sie können die Content API for Shopping verwenden, um ein neues lokales Produkt hochzuladen, das Sie in einem Geschäft verkaufen. Anschließend können Sie die Informationen zum Inventar für dieses Produkt mit der Merchant Inventories API LocalInventory verwalten.

Batchanfragen

Die Merchant API unterstützt nicht die Methode customBatch, die in der Content API for Shopping verwendet wird. Lesen Sie stattdessen den Hilfeartikel Mehrere Anfragen gleichzeitig senden oder führen Sie Ihre Aufrufe asynchron aus.

Im folgenden Beispiel wird gezeigt, wie eine Produkteingabe eingefügt wird.

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")
            .setGtin(0, "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 "FILE", 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);
  }
}

Wenn Sie customBatch in der Content API verwenden und diese Funktion für die Merchant API benötigen, teilen Sie uns dies in Ihrem Feedback mit.

IDs

Gemäß den Grundsätzen zur API-Optimierung von Google haben wir einige Änderungen an den IDs für Merchant API-Ressourcen vorgenommen.

Name ersetzt ID

Alle Merchant API-Ressourcen verwenden das Feld name als eindeutige Kennzeichnung.

Hier ein Beispiel für die Verwendung des Felds name in Ihren Aufrufen:

POST https://merchantapi.googleapis.com/inventories/v1beta/{PARENT}/regionalInventories:insert

Dieses neue Feld name wird als Ressourcen-ID für alle Lese- und Schreibaufrufe in der Merchant API zurückgegeben.

Implementieren Sie beispielsweise eine getName()-Methode, um die name aus einer Ressource abzurufen, und speichern Sie die Ausgabe als Variable, anstatt die name selbst aus den Händler- und Ressourcen-IDs zu erstellen.

übergeordnete Felder für untergeordnete Ressourcen

In der Merchant API haben alle untergeordneten Ressourcen das Feld parent. Du kannst das Feld parent verwenden, um die name der Ressource anzugeben, in die das untergeordnete Element eingefügt werden soll, anstatt die gesamte übergeordnete Ressource zu übergeben. Sie können das parent-Feld auch mit list-Methoden verwenden, um die untergeordneten Ressourcen dieses parent aufzulisten.

Wenn Sie beispielsweise lokale Inventare für ein bestimmtes Produkt auflisten möchten, geben Sie die name des Produkts im Feld parent für die Methode list an. In diesem Fall ist die angegebene product die parent der zurückgegebenen LocalInventory-Ressourcen.

Typen

Im Folgenden finden Sie einige gängige Typen, die für alle Unter-APIs der Merchant API verwendet werden.

Preis

Folgendes hat sich für Price im Merchant Common-Paket geändert:

Content API Merchant API
Feld „Betrag“ value:string amountMicros:int64
Währungsfeld currency:string currencyCode:string

Der Price-Betrag wird jetzt in Mikros erfasst. Dabei entspricht eine Million Mikros der Standardeinheit Ihrer Währung.

In der Content API for Shopping war Price eine Dezimalzahl im Stringformat.

Der Name des Felds „Betrag“ wurde von value in amountMicros geändert.

Der Name des Währungsfelds wurde von currency in currencyCode geändert. Das Format bleibt ISO 4217.