Bermigrasi dari Content API for Shopping ke Merchant API

Anda dapat menggunakan panduan ini untuk memigrasikan implementasi Content API for Shopping yang ada ke Merchant API. Untuk informasi selengkapnya tentang detail Merchant API dan sub-API-nya, lihat Desain Merchant API.

Mulai

Untuk mulai menggunakan Merchant API, ubah URL permintaan Anda ke format berikut:

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

Untuk informasi selengkapnya, lihat panduan cepat dan referensi Merchant API.

Peningkatan dibandingkan Content API

Merchant API memungkinkan Anda mengotomatiskan dan menyederhanakan alur kerja di Merchant Center serta menawarkan kemampuan yang lebih baik daripada Content API.

Kasus penggunaan utama:

  • Pengelolaan akun otomatis
  • Pengelolaan produk otomatis
  • Pengelolaan inventaris otomatis
  • Pelaporan kustom

Area peningkatan utama:

Dukungan gRPC

Merchant API mendukung gRPC dan REST. Anda dapat menggunakan gRPC untuk Merchant API dan REST untuk Content API for Shopping secara bersamaan.

Library klien Merchant API memerlukan gRPC.

Untuk informasi selengkapnya, lihat ringkasan gRPC.

Kompatibilitas

Panduan ini menjelaskan perubahan umum yang berlaku untuk seluruh Merchant API. Untuk perubahan pada fitur tertentu, di navigasi, temukan bagian Migrasi dari Content API, yang mencantumkan panduan individual.

Merchant API dirancang untuk berfungsi bersama fitur Content API for Shopping versi 2.1 yang ada.

Misalnya, Anda dapat menggunakan Merchant Inventories API bersama dengan implementasi products Content API for Shopping v2.1 yang ada. Anda dapat menggunakan Content API for Shopping untuk mengupload produk lokal baru (yang Anda jual di toko lokal), lalu menggunakan referensi Merchant Inventories API LocalInventory untuk mengelola informasi di toko untuk produk tersebut.

Permintaan batch

Merchant API tidak mendukung metode customBatch yang ditampilkan di Content API for Shopping. Sebagai gantinya, lihat Mengirim beberapa permintaan sekaligus atau jalankan panggilan secara asinkron.

Contoh berikut menunjukkan cara menyisipkan input produk.

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);
  }
}

Jika Anda menggunakan customBatch di Content API, dan memerlukan fitur ini untuk Merchant API, beri tahu kami alasannya dalam masukan Anda.

Pengenal

Agar selaras dengan prinsip peningkatan API Google, kami telah membuat beberapa perubahan pada ID untuk resource Merchant API.

nama menggantikan ID

Semua resource Merchant API menggunakan kolom name sebagai ID uniknya.

Berikut adalah contoh cara menggunakan kolom name dalam panggilan Anda:

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

Kolom name baru ini ditampilkan sebagai ID resource untuk semua panggilan baca dan tulis di Merchant API.

Misalnya, terapkan metode getName() untuk mengambil name dari resource, dan simpan output sebagai variabel, bukan membuat name dari ID bisnis dan resource sendiri.

Untuk permintaan HTTP, kolom name diambil dari URL. Ini akan mengganti name yang diberikan dalam isi permintaan HTTP.

Pembatas

Merchant API menggunakan tilde, bukan titik dua, sebagai pembatas.

Tabel berikut membandingkan ID produk untuk Content API dan Merchant API:

Content API Merchant API
channel:contentLanguage:feedLabel:offerId. Misalnya, online:en:US:sku123 channel~contentLanguage~feedLabel~offerId. Misalnya, online~en~US~sku123

kolom induk untuk resource turunan

Di Merchant API, semua resource turunan memiliki kolom parent. Anda dapat menggunakan kolom parent untuk menentukan name resource tempat memasukkan turunan, bukan meneruskan seluruh resource induk. Anda juga dapat menggunakan kolom parent dengan metode list untuk mencantumkan resource turunan dari parent tersebut.

Misalnya, untuk mencantumkan inventaris lokal untuk produk tertentu, tentukan name produk di kolom parent untuk metode list. Dalam hal ini, product yang diberikan adalah parent dari resource LocalInventory yang ditampilkan.

Jenis

Berikut adalah beberapa jenis umum yang dibagikan di seluruh sub-API Merchant API.

Harga

Berikut yang berubah untuk Price dalam paket Merchant Common:

Content API Merchant API
Kolom jumlah value:string amountMicros:int64
Kolom mata uang currency:string currencyCode:string

Jumlah Price kini dicatat dalam mikro, dengan 1 juta mikro setara dengan unit standar mata uang Anda.

Di Content API for Shopping, Price adalah angka desimal dalam bentuk string.

Nama kolom jumlah telah diubah dari value menjadi amountMicros

Nama kolom mata uang telah diubah dari currency menjadi currencyCode. Formatnya tetap ISO 4217.