Appelez l'API Amazon Product Advertising 5.0 (PA-API v5) en Java

Aperçu

--Appelez l'API 5.0 (PA-API v5) d'Amazon Product Advertising en Java

Exemple de code

Liste des fichiers

├── build.gradle
└── src
    └── main
        └── java
            ├── AwsSignature4.java
            ├── JsonUtil.java
            ├── MyApp.java
            └── PaApi5Wrapper.java

build.gradle

Fichier de configuration Gradle. Jackson est utilisé car la bibliothèque de manipulation JSON ne se trouve pas dans la bibliothèque standard Java.

plugins {
  id 'java'
  id 'application'
}

repositories {
  mavenCentral()
}

dependencies {
  //Utilisez Jackson
  implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.1'
}

application {
  mainClassName = 'MyApp'
}

sourceCompatibility = JavaVersion.VERSION_15

src/main/java/MyApp.java

import java.util.HashMap;
import java.util.Map;

/**
 * PA-Un exemple de classe qui appelle l'API v5.
 */
public class MyApp {

  public static void main(String[] args) throws Exception {
    // PA-Appeler l'API v5
    searchItems();
    getItems();
  }

  private static final String ACCESS_KEY = "<YOUR-ACCESS-KEY-HERE>"; //Clé d'accès obtenue
  private static final String SECRET_KEY = "<YOUR-SECRET-KEY-HERE>"; //Clé secrète obtenue
  private static final String TRACKING_ID = "<YOUR-PARTNER-TAG-HERE>"; //ID de suivi(Exemple: XXXXX-22)

  //Recherche de produits par mot-clé
  public static void searchItems() throws Exception {

    String keywords = "Shakespeare";

    //Informations requises
    Map<String, Object> req = new HashMap<>() {
      {
        put("ItemCount", 3); //Nombre de résultats de recherche
        put("PartnerTag", TRACKING_ID); //Identifiant de magasin ou identifiant de suivi
        put("PartnerType", "Associates"); //Type de partenaire
        put("Keywords", keywords); //Mot-clé de recherche
        put("SearchIndex", "All"); //Catégorie de recherche(All, AmazonVideo, Books, Hobbies,La musique, etc. peut être spécifiée)
        put("Resources", new String[]{ //Type de valeur à inclure dans la réponse
          "ItemInfo.Title",
          "ItemInfo.ByLineInfo",
          "ItemInfo.ProductInfo",
          "Images.Primary.Large",
          "Images.Primary.Medium",
          "Images.Primary.Small"
        });
      }
    };

    //Faire des informations de demande une chaîne JSON
    String reqJson = new JsonUtil().objectToJson(req);
    System.out.println("=====Recherche de produits par mot-clé:demande=====");
    System.out.println(reqJson);

    // PA-Appelez l'API v5 et recevez le résultat sous forme de chaîne JSON
    PaApi5Wrapper api = new PaApi5Wrapper(ACCESS_KEY, SECRET_KEY);
    String resJson = api.searchItems(reqJson);
    System.out.println("=====Recherche de produits par mot-clé:réponse=====");
    System.out.println(new JsonUtil().prettyPrint(resJson));
  }

  //Obtenir des informations sur les produits de l'ASIN
  public static void getItems() throws Exception {

    String[] asinList = new String[]{"4391641585", "B010EB1HR4", "B0125SPF90", "B07V52KSGT"};

    //Informations requises
    Map<String, Object> req = new HashMap<>() {
      {
        put("PartnerTag", TRACKING_ID); //Identifiant de magasin ou identifiant de suivi
        put("PartnerType", "Associates"); //Type de partenaire
        put("ItemIds", asinList); //Liste des ASIN
        put("Resources", new String[]{ //Type de valeur à inclure dans la réponse
          "ItemInfo.Title",
          "ItemInfo.ByLineInfo"
        });
      }
    };

    //Faire des informations de demande une chaîne JSON
    String reqJson = new JsonUtil().objectToJson(req);
    System.out.println("=====Obtenir des informations sur les produits de l'ASIN:demande=====");
    System.out.println(reqJson);

    // PA-Appelez l'API v5 et recevez le résultat sous forme de chaîne JSON
    PaApi5Wrapper api = new PaApi5Wrapper(ACCESS_KEY, SECRET_KEY);
    String resJson = api.getItems(reqJson);
    System.out.println("=====Obtenir des informations sur les produits de l'ASIN:réponse=====");
    System.out.println(new JsonUtil().prettyPrint(resJson));
  }
}

src/main/java/PaApi5Wrapper.java

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.time.Duration;
import java.util.Map;

/**
 * PA-Classe wrapper API v5.
 */
public class PaApi5Wrapper {

  private static final String HOST = "webservices.amazon.co.jp"; // Amazon.co.hôte API Web jp
  private static final String REGION = "us-west-2"; // Amazon.co.jp en nous-west-Précisez 2

  private final String accessKey;
  private final String secretKey;

  /**
   *constructeur.
   * @param accessKey Clé d'accès
   * @param secretKey clé secrète
   */
  public PaApi5Wrapper(String accessKey, String secretKey) {
    this.accessKey = accessKey;
    this.secretKey = secretKey;
  }

  /**
   *Recherchez des produits par mot-clé.
   * @param reqJson Demande d'informations JSON
   * @renvoyer les informations de réponse JSON
   * @throws InterruptedException
   * @throws IOException
   * @throws NoSuchAlgorithmException
   * @throws InvalidKeyException
   * @throws URISyntaxException
   */
  public String searchItems(String reqJson) throws InterruptedException, IOException, NoSuchAlgorithmException, InvalidKeyException, URISyntaxException {
    String path = "/paapi5/searchitems";
    String target = "com.amazon.paapi5.v1.ProductAdvertisingAPIv1.SearchItems";
    return callApi(reqJson, path, target);
  }

  /**
   *Obtenez des informations sur les produits auprès de l'ASIN.
   * @param reqJson Demande d'informations JSON
   * @renvoyer les informations de réponse JSON
   * @throws InterruptedException
   * @throws IOException
   * @throws NoSuchAlgorithmException
   * @throws InvalidKeyException
   * @throws URISyntaxException
   */
  public String getItems(String reqJson) throws InterruptedException, IOException, NoSuchAlgorithmException, InvalidKeyException, URISyntaxException {
    String path = "/paapi5/getitems";
    String target = "com.amazon.paapi5.v1.ProductAdvertisingAPIv1.GetItems";
    return callApi(reqJson, path, target);
  }

  /**
   * PA-Appelez l'API v5.
   * @param reqJson Demande d'informations JSON
   * @param path chemin du point d'entrée de l'API
   * @param target Service de destination de demande et opérations de données
   * @renvoyer les informations de réponse JSON
   * @throws URISyntaxException
   * @throws InvalidKeyException
   * @throws NoSuchAlgorithmException
   * @throws IOException
   * @throws InterruptedException
   */
  public String callApi(String reqJson, String path, String target) throws URISyntaxException, InvalidKeyException, NoSuchAlgorithmException, IOException, InterruptedException {

    //Utilisez l'API client HTTP officiellement introduite dans Java 11

    //Créer des informations de requête HTTP
    HttpRequest.Builder reqBuilder = HttpRequest.newBuilder()
      .uri(new URI("https://" + HOST + path)) //URL de l'appel API
      .POST(HttpRequest.BodyPublishers.ofString(reqJson)) //Définir les paramètres d'appel d'API
      .timeout(Duration.ofSeconds(10));

    //Obtenez des informations d'en-tête avec des informations de signature
    AwsSignature4 awsv4Auth = new AwsSignature4(accessKey, secretKey, path, REGION, HOST, target);
    Map<String, String> signedHeaders = awsv4Auth.getHeaders(reqJson);

    //Définir l'en-tête dans les informations de demande
    signedHeaders.remove("host"); //L'en-tête d'hôte n'est pas ajouté(jdk.httpclient.allowRestrictedHeaders)
    for (Map.Entry<String, String> entrySet : signedHeaders.entrySet()) {
      reqBuilder.header(entrySet.getKey(), entrySet.getValue());
    }

    //Générer des informations de requête HTTP
    HttpRequest req = reqBuilder.build();

    //Appelez l'API pour obtenir le résultat
    HttpClient client = HttpClient.newBuilder()
      .version(HttpClient.Version.HTTP_1_1)
      .connectTimeout(Duration.ofSeconds(10))
      .build();
    HttpResponse<String> res = client.send(req, HttpResponse.BodyHandlers.ofString());

    //Juger le succès / l'échec par code d'état
    if (res.statusCode() == 200) {
      return res.body();
    } else {
      throw new RuntimeException(res.body());
    }
  }
}

src/main/java/AwsSignature4.java

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.TimeZone;
import java.util.TreeMap;

/**
 *Version signée AWS 4(AWS Signature Version 4)
 */
public class AwsSignature4 {

  private static final String SERVICE = "ProductAdvertisingAPI"; // PA-API
  private static final String HMAC_ALGORITHM = "AWS4-HMAC-SHA256";
  private static final String AWS_4_REQUEST = "aws4_request";

  private final String awsAccessKey;
  private final String awsSecretKey;
  private final String path;
  private final String region;
  private final String host;
  private final String target;

  /**
   *constructeur.
   * @param awsAccessKey Clé d'accès
   * @param awsSecretKey Clé secrète
   * @param path chemin du point d'entrée de l'API
   * @région de la région param
   * @chemin du point d'entrée de l'API hôte param
   * @param target Service de destination de demande et opérations de données
   */
  public AwsSignature4(
    String awsAccessKey, String awsSecretKey,
    String path, String region,
    String host, String target) {
    this.awsAccessKey = awsAccessKey;
    this.awsSecretKey = awsSecretKey;
    this.path = path;
    this.region = region;
    this.host = host;
    this.target = target;
  }

  /**
   *Renvoie les informations d'en-tête pour l'authentification.
   * @param payload Demande d'informations JSON
   * @informations d'en-tête pour l'authentification de retour
   * @throws NoSuchAlgorithmException
   * @throws InvalidKeyException
   */
  public Map<String, String> getHeaders(String payload) throws NoSuchAlgorithmException, InvalidKeyException {
    //En-tête de base
    TreeMap<String, String> headers = new TreeMap<>();
    headers.put("host", host);
    headers.put("content-type", "application/json; charset=utf-8");
    headers.put("content-encoding", "amz-1.0");
    headers.put("x-amz-target", target);
    //Horodatage utilisé lors de la création d'une signature
    final Date date = new Date();
    headers.put("x-amz-date", getXAmzDateString(date));
    //En-tête signé(signed headers)
    String signedHeaders = createSignedHeaders(headers);
    //Demande régulière(canonical request)
    String canonicalRequest = createCanonicalRequest(path, headers, signedHeaders, payload);
    //Chaîne de signe(string to sign)
    String stringToSign = createStringToSign(date, region, canonicalRequest);
    //Signature(signature)
    String signature = calculateSignature(awsSecretKey, date, region, stringToSign);
    //Valeur d'en-tête d'autorisation
    String authorization = buildAuthorizationString(awsAccessKey, region, signature, signedHeaders, date);
    headers.put("Authorization", authorization);
    return headers;
  }

  //En-tête signé(signed headers)
  private static String createSignedHeaders(TreeMap<String, String> headers) {
    StringBuilder signedHeaderBuilder = new StringBuilder();
    for (String key : headers.keySet()) {
      signedHeaderBuilder.append(key).append(";");
    }
    return signedHeaderBuilder.substring(0, signedHeaderBuilder.length() - 1);
  }

  //Demande régulière(canonical request)
  private static String createCanonicalRequest(String path, TreeMap<String, String> headers, String signedHeaders, String payload) throws NoSuchAlgorithmException {
    StringBuilder canonicalRequest = new StringBuilder();
    canonicalRequest.append("POST").append("\n");
    canonicalRequest.append(path).append("\n").append("\n");
    for (String key : headers.keySet()) {
      canonicalRequest.append(key).append(":").append(headers.get(key)).append("\n");
    }
    canonicalRequest.append("\n");
    canonicalRequest.append(signedHeaders).append("\n");
    canonicalRequest.append(sha256(payload));
    return canonicalRequest.toString();
  }

  //Chaîne de signe(string to sign)
  private static String createStringToSign(Date current, String region, String canonicalRequest) throws NoSuchAlgorithmException {
    return HMAC_ALGORITHM + "\n"
      + getXAmzDateString(current) + "\n"
      + getYMDString(current) + "/" + region + "/" + SERVICE + "/" + AWS_4_REQUEST + "\n"
      + sha256(canonicalRequest);
  }

  //Signature(signature)
  private static String calculateSignature(String awsSecretKey, Date current, String region, String stringToSign) throws InvalidKeyException, NoSuchAlgorithmException {
    final String currentDate = getYMDString(current);
    byte[] signatureKey = getSigningKey(awsSecretKey, currentDate, region);
    byte[] signature = hmacSha256(signatureKey, stringToSign);
    return bytesToHex(signature);
  }

  //Clé de signature(signing key)
  private static byte[] getSigningKey(String key, String date, String region) throws InvalidKeyException, NoSuchAlgorithmException {
    //Le résultat de chaque fonction de hachage est l'entrée de la fonction de hachage suivante
    byte[] kSecret = ("AWS4" + key).getBytes(StandardCharsets.UTF_8);
    byte[] kDate = hmacSha256(kSecret, date);
    byte[] kRegion = hmacSha256(kDate, region);
    byte[] kService = hmacSha256(kRegion, SERVICE);
    byte[] kSigning = hmacSha256(kService, AWS_4_REQUEST);
    return kSigning;
  }

  //Valeur d'en-tête d'autorisation
  private static String buildAuthorizationString(String awsAccessKey, String region, String signature, String signedHeaders, Date current) {
    return HMAC_ALGORITHM + " "
      + "Credential=" + awsAccessKey + "/" + getYMDString(current) + "/" + region + "/" + SERVICE + "/" + AWS_4_REQUEST + ","
      + "SignedHeaders=" + signedHeaders + ","
      + "Signature=" + signature;
  }

  //Fonction de hachage SHA-256
  private static String sha256(String data) throws NoSuchAlgorithmException {
    MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
    messageDigest.update(data.getBytes(StandardCharsets.UTF_8));
    byte[] digest = messageDigest.digest();
    return String.format("%064x", new java.math.BigInteger(1, digest));
  }

  // HMAC-Fonction SHA256
  private static byte[] hmacSha256(byte[] key, String data) throws NoSuchAlgorithmException, InvalidKeyException {
    Mac mac = Mac.getInstance("HmacSHA256");
    mac.init(new SecretKeySpec(key, "HmacSHA256"));
    return mac.doFinal(data.getBytes(StandardCharsets.UTF_8));
  }

  //Convertir les valeurs binaires en représentation hexadécimale
  private static String bytesToHex(byte[] data) {
    final char[] hexCode = "0123456789ABCDEF".toCharArray();
    StringBuilder r = new StringBuilder(data.length * 2);
    for (byte b : data) {
      r.append(hexCode[(b >> 4) & 0xF]);
      r.append(hexCode[(b & 0xF)]);
    }
    return r.toString().toLowerCase();
  }

  // x-amz-Chaîne de date et d'heure pour l'en-tête de date(AAAAMMJJ en UTC'T'HHMMSS'Z'Format ISO 8601)
  private static String getXAmzDateString(Date date) {
    DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'"); // ISO 8601
    dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    return dateFormat.format(date);
  }

  //Chaîne de date format aaaaMMjj
  private static String getYMDString(Date date) {
    DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
    dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    return dateFormat.format(date);
  }
}

src/main/java/JsonUtil.java

//Utilisez la bibliothèque externe Jackson
import com.fasterxml.jackson.core.json.JsonWriteFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import java.io.StringWriter;
import java.util.Map;

/**
 *Classe d'opération JSON.
 */
public class JsonUtil {

  /**
   *Générez une chaîne JSON à partir de l'objet.
   * @objet param obj
   * @retourne la chaîne JSON
   * @throws IOException
   */
  public String objectToJson(Map<String, Object> obj) throws IOException {
    StringWriter out = new StringWriter();
    ObjectMapper mapper = new ObjectMapper();
    //Unicode d'échappement sauf pour les caractères ASCII
    mapper.configure(JsonWriteFeature.ESCAPE_NON_ASCII.mappedFeature(), true);
    mapper.writerWithDefaultPrettyPrinter().writeValue(out, obj);
    return out.toString();
  }

  /**
   *Rendez JSON plus facile à lire.
   * @param json chaîne JSON
   * @return Chaîne JSON facile à lire
   * @throws IOException
   */
  public String prettyPrint(String json) throws IOException {
    StringWriter out = new StringWriter();
    ObjectMapper mapper = new ObjectMapper();
    mapper.writerWithDefaultPrettyPrinter().writeValue(out, mapper.readValue(json, Map.class));
    return out.toString();
  }
}

Exemple de résultat d'exécution de code

Environnement d'exécution: macOS Catalina + Java 15 (AdoptOpenJDK 15) + Gradle 6.6.1

$ gradle run
Starting a Gradle Daemon (subsequent builds will be faster)

> Task :run
=====Recherche de produits par mot-clé:demande=====
{
  "PartnerType" : "Associates",
  "PartnerTag" : "XXXXX-22",
  "Keywords" : "\u30B7\u30A7\u30A4\u30AF\u30B9\u30D4\u30A2",
  "SearchIndex" : "All",
  "ItemCount" : 3,
  "Resources" : [ "ItemInfo.Title", "ItemInfo.ByLineInfo", "ItemInfo.ProductInfo", "ItemInfo.ProductInfo", "Images.Primary.Large", "Images.Primary.Medium", "Images.Primary.Small" ]
}
=====Recherche de produits par mot-clé:réponse=====
{
  "SearchResult" : {
    "Items" : [ {
      "ASIN" : "B06ZZH149Y",
      "DetailPageURL" : "https://www.amazon.co.jp/dp/B06ZZH149Y?tag=XXXXX-22&linkCode=osi&th=1&psc=1",
      "Images" : {
        "Primary" : {
          "Large" : {
            "Height" : 500,
            "URL" : "https://m.media-amazon.com/images/I/41Ms+C0NwNL.jpg ",
            "Width" : 311
          },
          "Medium" : {
            "Height" : 160,
            "URL" : "https://m.media-amazon.com/images/I/41Ms+C0NwNL._SL160_.jpg ",
            "Width" : 100
          },
          "Small" : {
            "Height" : 75,
            "URL" : "https://m.media-amazon.com/images/I/41Ms+C0NwNL._SL75_.jpg ",
            "Width" : 47
          }
        }
      },
      "ItemInfo" : {
        "ByLineInfo" : {
          "Contributors" : [ {
            "Locale" : "ja_JP",
            "Name" : "Shoichiro Kawai",
            "Role" : "Écrit par",
            "RoleType" : "author"
          } ],
          "Manufacturer" : {
            "DisplayValue" : "Shodensha",
            "Label" : "Manufacturer",
            "Locale" : "ja_JP"
          }
        },
        "ProductInfo" : {
          "IsAdultProduct" : {
            "DisplayValue" : false,
            "Label" : "IsAdultProduct",
            "Locale" : "en_US"
          },
          "ReleaseDate" : {
            "DisplayValue" : "2017-04-21T00:00:00.000Z",
            "Label" : "ReleaseDate",
            "Locale" : "en_US"
          }
        },
        "Title" : {
          "DisplayValue" : "Toutes les œuvres de Shakespeare lues dans le synopsis(Nouveau livre Shodensha)",
          "Label" : "Title",
          "Locale" : "ja_JP"
        }
      }
    }, {
      "ASIN" : "B015BY1Q6Q",
      "DetailPageURL" : "https://www.amazon.co.jp/dp/B015BY1Q6Q?tag=XXXXX-22&linkCode=osi&th=1&psc=1",
      "Images" : {
        "Primary" : {
          "Large" : {
            "Height" : 500,
            "URL" : "https://m.media-amazon.com/images/I/516XD+o35gL.jpg ",
            "Width" : 375
          },
          "Medium" : {
            "Height" : 160,
            "URL" : "https://m.media-amazon.com/images/I/516XD+o35gL._SL160_.jpg ",
            "Width" : 120
          },
          "Small" : {
            "Height" : 75,
            "URL" : "https://m.media-amazon.com/images/I/516XD+o35gL._SL75_.jpg ",
            "Width" : 56
          }
        }
      },
      "ItemInfo" : {
        "ByLineInfo" : {
          "Contributors" : [ {
            "Locale" : "ja_JP",
            "Name" : "Mel Gibson",
            "Role" : "Apparence",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Glen Fermer",
            "Role" : "Apparence",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Alan Bates",
            "Role" : "Apparence",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Paul Scofield",
            "Role" : "Apparence",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Franco Zephyrelli",
            "Role" : "réalisé par",
            "RoleType" : "director"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Christopher Devore",
            "Role" : "Writer",
            "RoleType" : "writer"
          } ]
        },
        "ProductInfo" : {
          "IsAdultProduct" : {
            "DisplayValue" : false,
            "Label" : "IsAdultProduct",
            "Locale" : "en_US"
          },
          "ReleaseDate" : {
            "DisplayValue" : "2015-09-16T00:00:00.000Z",
            "Label" : "ReleaseDate",
            "Locale" : "en_US"
          }
        },
        "Title" : {
          "DisplayValue" : "Hamlet(Version sous-titrée)",
          "Label" : "Title",
          "Locale" : "ja_JP"
        }
      }
    }, {
      "ASIN" : "B07WPXRT5W",
      "DetailPageURL" : "https://www.amazon.co.jp/dp/B07WPXRT5W?tag=XXXXX-22&linkCode=osi&th=1&psc=1",
      "Images" : {
        "Primary" : {
          "Large" : {
            "Height" : 375,
            "URL" : "https://m.media-amazon.com/images/I/51CnJBKwu5L.jpg ",
            "Width" : 500
          },
          "Medium" : {
            "Height" : 120,
            "URL" : "https://m.media-amazon.com/images/I/51CnJBKwu5L._SL160_.jpg ",
            "Width" : 160
          },
          "Small" : {
            "Height" : 56,
            "URL" : "https://m.media-amazon.com/images/I/51CnJBKwu5L._SL75_.jpg ",
            "Width" : 75
          }
        }
      },
      "ItemInfo" : {
        "ByLineInfo" : {
          "Contributors" : [ {
            "Locale" : "ja_JP",
            "Name" : "Mark Benton",
            "Role" : "Apparence",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Joe Joiner",
            "Role" : "Apparence",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Ambre Aga",
            "Role" : "Apparence",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Richard Signy",
            "Role" : "réalisé par",
            "RoleType" : "director"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Ian Barber",
            "Role" : "réalisé par",
            "RoleType" : "director"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Will Trotter",
            "Role" : "Produire",
            "RoleType" : "producer"
          } ]
        },
        "ProductInfo" : {
          "IsAdultProduct" : {
            "DisplayValue" : false,
            "Label" : "IsAdultProduct",
            "Locale" : "en_US"
          }
        },
        "Title" : {
          "DisplayValue" : "Épisode 1",
          "Label" : "Title",
          "Locale" : "ja_JP"
        }
      }
    } ],
    "SearchURL" : "https://www.amazon.co.jp/s?k=%E3%82%B7%E3%82%A7%E3%82%A4%E3%82%AF%E3%82%B9%E3%83%94%E3%82%A2&rh=p_n_availability%3A-1&tag=XXXXX-22&linkCode=osi",
    "TotalResultCount" : 146
  }
}
=====Obtenir des informations sur les produits de l'ASIN:demande=====
{
  "PartnerType" : "Associates",
  "PartnerTag" : "XXXXX-22",
  "Resources" : [ "ItemInfo.Title", "ItemInfo.ByLineInfo" ],
  "ItemIds" : [ "4391641585", "B010EB1HR4", "B0125SPF90", "B07V52KSGT" ]
}
=====Obtenir des informations sur les produits de l'ASIN:réponse=====
{
  "ItemsResult" : {
    "Items" : [ {
      "ASIN" : "4391641585",
      "DetailPageURL" : "https://www.amazon.co.jp/dp/4391641585?tag=XXXXX-22&linkCode=ogi&th=1&psc=1",
      "ItemInfo" : {
        "ByLineInfo" : {
          "Contributors" : [ {
            "Locale" : "ja_JP",
            "Name" : "Soleil X",
            "Role" : "Surveillance",
            "RoleType" : "consultant_editor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Femme au foyer et entreprise de style de vie",
            "Role" : "Éditer",
            "RoleType" : "editor"
          } ],
          "Manufacturer" : {
            "DisplayValue" : "Femme au foyer et entreprise de style de vie",
            "Label" : "Manufacturer",
            "Locale" : "ja_JP"
          }
        },
        "Title" : {
          "DisplayValue" : "Guide officiel du test Sumikko Gurashi Encyclopédie Sumikko Gurashi(Série Life)",
          "Label" : "Title",
          "Locale" : "ja_JP"
        }
      }
    }, {
      "ASIN" : "B010EB1HR4",
      "DetailPageURL" : "https://www.amazon.co.jp/dp/B010EB1HR4?tag=XXXXX-22&linkCode=ogi&th=1&psc=1",
      "ItemInfo" : {
        "ByLineInfo" : {
          "Brand" : {
            "DisplayValue" : "Hostess Entertainmen",
            "Label" : "Brand",
            "Locale" : "ja_JP"
          },
          "Contributors" : [ {
            "Locale" : "ja_JP",
            "Name" : "Halloween",
            "Role" : "Artiste",
            "RoleType" : "artist"
          } ],
          "Manufacturer" : {
            "DisplayValue" : "hôtesse",
            "Label" : "Manufacturer",
            "Locale" : "ja_JP"
          }
        },
        "Title" : {
          "DisplayValue" : "Guardian Shinden Chapitre 2<Édition étendue>(Remasterisé)",
          "Label" : "Title",
          "Locale" : "ja_JP"
        }
      }
    }, {
      "ASIN" : "B0125SPF90",
      "DetailPageURL" : "https://www.amazon.co.jp/dp/B0125SPF90?tag=XXXXX-22&linkCode=ogi&th=1&psc=1",
      "ItemInfo" : {
        "ByLineInfo" : {
          "Brand" : {
            "DisplayValue" : "Rubis Japon(RUBIE'S JAPAN)",
            "Label" : "Brand",
            "Locale" : "ja_JP"
          },
          "Manufacturer" : {
            "DisplayValue" : "Rubis Japon(RUBIE'S JAPAN)",
            "Label" : "Manufacturer",
            "Locale" : "ja_JP"
          }
        },
        "Title" : {
          "DisplayValue" : "Accessoire de décoration Halloween Citrouille à bascule H 130cm",
          "Label" : "Title",
          "Locale" : "ja_JP"
        }
      }
    }, {
      "ASIN" : "B07V52KSGT",
      "DetailPageURL" : "https://www.amazon.co.jp/dp/B07V52KSGT?tag=XXXXX-22&linkCode=ogi&th=1&psc=1",
      "ItemInfo" : {
        "ByLineInfo" : {
          "Contributors" : [ {
            "Locale" : "ja_JP",
            "Name" : "Lian Reese",
            "Role" : "Apparence",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Jamie Lee Curtis",
            "Role" : "Apparence",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Will Patton",
            "Role" : "Apparence",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Judy Greer",
            "Role" : "Apparence",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Virginie Gardner",
            "Role" : "Apparence",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Jefferson Hall",
            "Role" : "Apparence",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Andy Mattichuck",
            "Role" : "Apparence",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Nick Castle",
            "Role" : "Apparence",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "James Jude Courtney",
            "Role" : "Apparence",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Hulk Birginer",
            "Role" : "Apparence",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "David Gordon Green",
            "Role" : "réalisé par",
            "RoleType" : "director"
          }, {
            "Locale" : "ja_JP",
            "Name" : "David Gordon Green",
            "Role" : "Writer",
            "RoleType" : "writer"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Danny McBride",
            "Role" : "Writer",
            "RoleType" : "writer"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Jeff Floodley",
            "Role" : "Writer",
            "RoleType" : "writer"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Marek Acad",
            "Role" : "Produire",
            "RoleType" : "producer"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Jason Bram",
            "Role" : "Produire",
            "RoleType" : "producer"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Bloc de facture",
            "Role" : "Produire",
            "RoleType" : "producer"
          } ]
        },
        "Title" : {
          "DisplayValue" : "Halloween(Version sous-titrée)",
          "Label" : "Title",
          "Locale" : "ja_JP"
        }
      }
    } ]
  }
}

BUILD SUCCESSFUL in 13s
2 actionable tasks: 2 executed

Matériel de référence

Recommended Posts

Appelez l'API Amazon Product Advertising 5.0 (PA-API v5) en Java
Utilisez le SDK Amazon Product Advertising API 5.0 (PA-API v5) (paapi5-java-sdk-1.0.0)
Appelez l'API de notification Windows en Java
API Zabbix en Java
Exemple de code pour appeler l'API Yahoo! Shopping Product Search (v3) avec Spring RestTemplate
API Java Stream en 5 minutes
Ce chat de Metadata Co., Ltd. Appelle l'API cat en Java.
Comment appeler et utiliser l'API en Java (Spring Boot)
Générer AWS Signature V4 en Java et demander l'API
Implémenter reCAPTCHA v3 dans Java / Spring
Générer l'URL de l'API CloudStack en Java
Hit l'API de Zaim (OAuth 1.0) en Java
Analyser l'analyse syntaxique de l'API COTOHA en Java
Exemple de code pour appeler l'API Yahoo! Local Search en Java
Appelez l'API Java de TensorFlow depuis Scala
JPA (API de persistance Java) dans Eclipse
Appelez la super méthode en Java
Exemple de code pour appeler l'API Yahoo! Shopping Product Search (v3) avec l'API client HTTP officiellement introduite à partir de Java 11
J'ai essayé d'utiliser l'API Elasticsearch en Java
Implémenter l'autorisation API Gateway Lambda dans Java Lambda
Étude de Java 8 (API de date dans le package java.time)
Appeler l'API GitHub à partir de l'API Socket de Java, partie 2
Appel de méthodes Java à partir de JavaScript exécutées en Java
Essayez d'utiliser l'API Stream en Java
Essayez d'utiliser l'API au format JSON en Java
Appeler la reconnaissance visuelle dans Watson Java SDK
[Java] Nouvelle spécification Implémentation de l'API de recherche de produits Yahoo!
Appeler l'API [Appel]
J'ai essayé de créer un outil de comparaison des prix des produits Amazon dans le monde entier avec Java, l'API Amazon Product Advertising, l'API Currency (29/01/2017)
ChatWork4j pour l'utilisation de l'API ChatWork en Java
[Java] Création d'API à l'aide de Jerjey (Jax-rs) avec eclipse
Appel de méthode Java depuis RPG (appel de méthode dans sa propre classe)
[Java] Créez quelque chose comme une API de recherche de produits
Envoyer des e-mails à l'aide d'Amazon SES SMTP en Java
Essayez d'utiliser l'API Cloud Vision de GCP en Java
Essayez d'utiliser l'analyse syntaxique de l'API COTOHA en Java