Rufen Sie die Amazon Product Advertising API 5.0 (PA-API v5) in Java auf

Überblick

Beispielcode

Dateiliste

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

build.gradle

Gradle-Konfigurationsdatei. Da sich die JSON-Manipulationsbibliothek nicht in der Java-Standardbibliothek befindet, wird Jackson verwendet.

plugins {
  id 'java'
  id 'application'
}

repositories {
  mavenCentral()
}

dependencies {
  //Verwenden Sie 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-Eine Beispielklasse, die API v5 aufruft.
 */
public class MyApp {

  public static void main(String[] args) throws Exception {
    // PA-Rufen Sie API v5 auf
    searchItems();
    getItems();
  }

  private static final String ACCESS_KEY = "<YOUR-ACCESS-KEY-HERE>"; //Erhaltener Zugangsschlüssel
  private static final String SECRET_KEY = "<YOUR-SECRET-KEY-HERE>"; //Erhaltener geheimer Schlüssel
  private static final String TRACKING_ID = "<YOUR-PARTNER-TAG-HERE>"; //Tracking ID(Beispiel: XXXXX-22)

  //Suche nach Produkten nach Stichwort
  public static void searchItems() throws Exception {

    String keywords = "Shakespeare";

    //Anfrage Informationen
    Map<String, Object> req = new HashMap<>() {
      {
        put("ItemCount", 3); //Anzahl der Suchergebnisse
        put("PartnerTag", TRACKING_ID); //Geschäfts-ID oder Tracking-ID
        put("PartnerType", "Associates"); //Partnertyp
        put("Keywords", keywords); //Suchbegriff
        put("SearchIndex", "All"); //Suchkategorie(All, AmazonVideo, Books, Hobbies,Musik etc. kann angegeben werden)
        put("Resources", new String[]{ //Art des Werts, der in die Antwort aufgenommen werden soll
          "ItemInfo.Title",
          "ItemInfo.ByLineInfo",
          "ItemInfo.ProductInfo",
          "Images.Primary.Large",
          "Images.Primary.Medium",
          "Images.Primary.Small"
        });
      }
    };

    //Machen Sie Anforderungsinformationen zu einer JSON-Zeichenfolge
    String reqJson = new JsonUtil().objectToJson(req);
    System.out.println("=====Suche nach Produkten nach Stichwort:Anfrage=====");
    System.out.println(reqJson);

    // PA-Rufen Sie API v5 auf und erhalten Sie das Ergebnis als JSON-Zeichenfolge
    PaApi5Wrapper api = new PaApi5Wrapper(ACCESS_KEY, SECRET_KEY);
    String resJson = api.searchItems(reqJson);
    System.out.println("=====Suche nach Produkten nach Stichwort:Antwort=====");
    System.out.println(new JsonUtil().prettyPrint(resJson));
  }

  //Erhalten Sie Produktinformationen von ASIN
  public static void getItems() throws Exception {

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

    //Anfrage Informationen
    Map<String, Object> req = new HashMap<>() {
      {
        put("PartnerTag", TRACKING_ID); //Geschäfts-ID oder Tracking-ID
        put("PartnerType", "Associates"); //Partnertyp
        put("ItemIds", asinList); //Liste der ASIN
        put("Resources", new String[]{ //Art des Werts, der in die Antwort aufgenommen werden soll
          "ItemInfo.Title",
          "ItemInfo.ByLineInfo"
        });
      }
    };

    //Machen Sie Anforderungsinformationen zu einer JSON-Zeichenfolge
    String reqJson = new JsonUtil().objectToJson(req);
    System.out.println("=====Erhalten Sie Produktinformationen von ASIN:Anfrage=====");
    System.out.println(reqJson);

    // PA-Rufen Sie API v5 auf und erhalten Sie das Ergebnis als JSON-Zeichenfolge
    PaApi5Wrapper api = new PaApi5Wrapper(ACCESS_KEY, SECRET_KEY);
    String resJson = api.getItems(reqJson);
    System.out.println("=====Erhalten Sie Produktinformationen von ASIN:Antwort=====");
    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-API v5-Wrapper-Klasse.
 */
public class PaApi5Wrapper {

  private static final String HOST = "webservices.amazon.co.jp"; // Amazon.co.JP Web API Host
  private static final String REGION = "us-west-2"; // Amazon.co.jp in uns-west-Geben Sie 2 an

  private final String accessKey;
  private final String secretKey;

  /**
   *Konstrukteur.
   * @param accessKey Zugriffsschlüssel
   * @param secretKey geheimer Schlüssel
   */
  public PaApi5Wrapper(String accessKey, String secretKey) {
    this.accessKey = accessKey;
    this.secretKey = secretKey;
  }

  /**
   *Suche nach Produkten nach Stichwort.
   * @param reqJson Informationen anfordern JSON
   * @Antwortinformationen zurückgeben 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);
  }

  /**
   *Erhalten Sie Produktinformationen von ASIN.
   * @param reqJson Informationen anfordern JSON
   * @Antwortinformationen zurückgeben 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-Rufen Sie API v5 auf.
   * @param reqJson Informationen anfordern JSON
   * @Parameterpfad API-Einstiegspunktpfad
   * @param target Zieldienst und Datenoperationen anfordern
   * @Antwortinformationen zurückgeben 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 {

    //Verwenden Sie die in Java 11 offiziell eingeführte HTTP-Client-API

    //Erstellen Sie HTTP-Anforderungsinformationen
    HttpRequest.Builder reqBuilder = HttpRequest.newBuilder()
      .uri(new URI("https://" + HOST + path)) //URL für API-Aufruf
      .POST(HttpRequest.BodyPublishers.ofString(reqJson)) //Legen Sie die API-Aufrufparameter fest
      .timeout(Duration.ofSeconds(10));

    //Abrufen von Header-Informationen mit Signaturinformationen
    AwsSignature4 awsv4Auth = new AwsSignature4(accessKey, secretKey, path, REGION, HOST, target);
    Map<String, String> signedHeaders = awsv4Auth.getHeaders(reqJson);

    //Setzen Sie den Header in den Anforderungsinformationen
    signedHeaders.remove("host"); //Host-Header wird nicht hinzugefügt(jdk.httpclient.allowRestrictedHeaders)
    for (Map.Entry<String, String> entrySet : signedHeaders.entrySet()) {
      reqBuilder.header(entrySet.getKey(), entrySet.getValue());
    }

    //Generieren Sie HTTP-Anforderungsinformationen
    HttpRequest req = reqBuilder.build();

    //Rufen Sie die API auf, um das Ergebnis zu erhalten
    HttpClient client = HttpClient.newBuilder()
      .version(HttpClient.Version.HTTP_1_1)
      .connectTimeout(Duration.ofSeconds(10))
      .build();
    HttpResponse<String> res = client.send(req, HttpResponse.BodyHandlers.ofString());

    //Beurteilen Sie Erfolg / Misserfolg anhand des Statuscodes
    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;

/**
 *AWS Signed Version 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;

  /**
   *Konstrukteur.
   * @param awsAccessKey Zugriffsschlüssel
   * @param awsSecretKey Geheimer Schlüssel
   * @Parameterpfad API-Einstiegspunktpfad
   * @param region region
   * @Einstiegspfad der param-Host-API
   * @param target Zieldienst und Datenoperationen anfordern
   */
  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;
  }

  /**
   *Gibt Header-Informationen zur Authentifizierung zurück.
   * @param payload Anforderungsinformationen JSON
   * @Header-Informationen für die Rückgabeauthentifizierung
   * @throws NoSuchAlgorithmException
   * @throws InvalidKeyException
   */
  public Map<String, String> getHeaders(String payload) throws NoSuchAlgorithmException, InvalidKeyException {
    //Basiskopf
    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);
    //Zeitstempel, der beim Erstellen einer Signatur verwendet wird
    final Date date = new Date();
    headers.put("x-amz-date", getXAmzDateString(date));
    //Signierter Header(signed headers)
    String signedHeaders = createSignedHeaders(headers);
    //Regelmäßige Anfrage(canonical request)
    String canonicalRequest = createCanonicalRequest(path, headers, signedHeaders, payload);
    //Zeichenfolge(string to sign)
    String stringToSign = createStringToSign(date, region, canonicalRequest);
    //Unterschrift(signature)
    String signature = calculateSignature(awsSecretKey, date, region, stringToSign);
    //Autorisierungsheaderwert
    String authorization = buildAuthorizationString(awsAccessKey, region, signature, signedHeaders, date);
    headers.put("Authorization", authorization);
    return headers;
  }

  //Signierter Header(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);
  }

  //Regelmäßige Anfrage(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();
  }

  //Zeichenfolge(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);
  }

  //Unterschrift(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);
  }

  //Signierschlüssel(signing key)
  private static byte[] getSigningKey(String key, String date, String region) throws InvalidKeyException, NoSuchAlgorithmException {
    //Das Ergebnis jeder Hash-Funktion ist die Eingabe der nächsten Hash-Funktion
    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;
  }

  //Autorisierungsheaderwert
  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;
  }

  //Hash-Funktion 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-SHA256 Funktion
  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));
  }

  //Konvertieren Sie Binärwerte in eine hexadezimale Darstellung
  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-Datums- und Zeitzeichenfolge für den Datumsheader(JJJJMMTT in UTC'T'HHMMSS'Z'ISO 8601-Format)
  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);
  }

  //Datumszeichenfolge JJJJMMTT-Format
  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

//Verwenden Sie die externe Bibliothek 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;

/**
 *JSON-Operationsklasse.
 */
public class JsonUtil {

  /**
   *Generieren Sie eine JSON-Zeichenfolge aus dem Objekt.
   * @param obj Objekt
   * @JSON-String zurückgeben
   * @throws IOException
   */
  public String objectToJson(Map<String, Object> obj) throws IOException {
    StringWriter out = new StringWriter();
    ObjectMapper mapper = new ObjectMapper();
    //Unicode-Escape mit Ausnahme von ASCII-Zeichen
    mapper.configure(JsonWriteFeature.ESCAPE_NON_ASCII.mappedFeature(), true);
    mapper.writerWithDefaultPrettyPrinter().writeValue(out, obj);
    return out.toString();
  }

  /**
   *Erleichtern Sie das Lesen von JSON.
   * @param json JSON-Zeichenfolge
   * @Rückgabe der einfach zu lesenden JSON-Zeichenfolge
   * @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();
  }
}

Ergebnis der Beispielcodeausführung

Ausführungsumgebung: macOS Catalina + Java 15 (AdoptOpenJDK 15) + Gradle 6.6.1

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

> Task :run
=====Suche nach Produkten nach Stichwort:Anfrage=====
{
  "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" ]
}
=====Suche nach Produkten nach Stichwort:Antwort=====
{
  "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" : "Geschrieben von",
            "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" : "Alle Shakespeare-Werke sind in der Inhaltsangabe zu lesen(Shodensha neues Buch)",
          "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" : "Aussehen",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Glen Close",
            "Role" : "Aussehen",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Alan Bates",
            "Role" : "Aussehen",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Paul Scofield",
            "Role" : "Aussehen",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Franco Zephyrelli",
            "Role" : "unter der Regie von",
            "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" : "Weiler(Untertitelversion)",
          "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" : "Aussehen",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Joe Joiner",
            "Role" : "Aussehen",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Amber Aga",
            "Role" : "Aussehen",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Richard Signy",
            "Role" : "unter der Regie von",
            "RoleType" : "director"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Ian Barber",
            "Role" : "unter der Regie von",
            "RoleType" : "director"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Will Trotter",
            "Role" : "Produzieren",
            "RoleType" : "producer"
          } ]
        },
        "ProductInfo" : {
          "IsAdultProduct" : {
            "DisplayValue" : false,
            "Label" : "IsAdultProduct",
            "Locale" : "en_US"
          }
        },
        "Title" : {
          "DisplayValue" : "Episode 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
  }
}
=====Erhalten Sie Produktinformationen von ASIN:Anfrage=====
{
  "PartnerType" : "Associates",
  "PartnerTag" : "XXXXX-22",
  "Resources" : [ "ItemInfo.Title", "ItemInfo.ByLineInfo" ],
  "ItemIds" : [ "4391641585", "B010EB1HR4", "B0125SPF90", "B07V52KSGT" ]
}
=====Erhalten Sie Produktinformationen von ASIN:Antwort=====
{
  "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" : "So X.",
            "Role" : "Aufsicht",
            "RoleType" : "consultant_editor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Hausfrau und Lifestyle-Unternehmen",
            "Role" : "Bearbeiten",
            "RoleType" : "editor"
          } ],
          "Manufacturer" : {
            "DisplayValue" : "Hausfrau und Lifestyle-Unternehmen",
            "Label" : "Manufacturer",
            "Locale" : "ja_JP"
          }
        },
        "Title" : {
          "DisplayValue" : "Sumikko Gurashi Test Offizieller Leitfaden Sumikko Gurashi Enzyklopädie(Lebensreihe)",
          "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" : "Künstler",
            "RoleType" : "artist"
          } ],
          "Manufacturer" : {
            "DisplayValue" : "Hostess",
            "Label" : "Manufacturer",
            "Locale" : "ja_JP"
          }
        },
        "Title" : {
          "DisplayValue" : "Guardian Shinden Kapitel 2<Erweiterte Ausgabe>(Remaster)",
          "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" : "Rubine Japan(RUBIE'S JAPAN)",
            "Label" : "Brand",
            "Locale" : "ja_JP"
          },
          "Manufacturer" : {
            "DisplayValue" : "Rubine Japan(RUBIE'S JAPAN)",
            "Label" : "Manufacturer",
            "Locale" : "ja_JP"
          }
        },
        "Title" : {
          "DisplayValue" : "Halloween Schaukelkürbis Wohnaccessoire 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" : "Aussehen",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Jamie Lee Curtis",
            "Role" : "Aussehen",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Will Patton",
            "Role" : "Aussehen",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Judy Greer",
            "Role" : "Aussehen",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Virginia Gardner",
            "Role" : "Aussehen",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Jefferson Hall",
            "Role" : "Aussehen",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Andy Mattichuck",
            "Role" : "Aussehen",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Nick Castle",
            "Role" : "Aussehen",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "James Jude Courtney",
            "Role" : "Aussehen",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Hulk Birginer",
            "Role" : "Aussehen",
            "RoleType" : "actor"
          }, {
            "Locale" : "ja_JP",
            "Name" : "David Gordon Green",
            "Role" : "unter der Regie von",
            "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" : "Produzieren",
            "RoleType" : "producer"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Jason Bram",
            "Role" : "Produzieren",
            "RoleType" : "producer"
          }, {
            "Locale" : "ja_JP",
            "Name" : "Rechnungsblock",
            "Role" : "Produzieren",
            "RoleType" : "producer"
          } ]
        },
        "Title" : {
          "DisplayValue" : "Halloween(Untertitelversion)",
          "Label" : "Title",
          "Locale" : "ja_JP"
        }
      }
    } ]
  }
}

BUILD SUCCESSFUL in 13s
2 actionable tasks: 2 executed

Referenzmaterial

Recommended Posts

Rufen Sie die Amazon Product Advertising API 5.0 (PA-API v5) in Java auf
Verwenden Sie das SDK der Amazon Product Advertising API 5.0 (PA-API v5) (paapi5-java-sdk-1.0.0).
Rufen Sie die Windows-Benachrichtigungs-API in Java auf
Zabbix API in Java
Beispielcode zum Aufrufen der Yahoo! Shopping Product Search (v3) -API mit Spring RestTemplate
Java Stream API in 5 Minuten
Diese Katze von Metadata Co., Ltd. Ruft die Katzen-API in Java auf.
Aufrufen und Verwenden der API in Java (Spring Boot)
Generieren Sie AWS Signature V4 in Java und fordern Sie die API an
Implementieren Sie reCAPTCHA v3 in Java / Spring
Generieren Sie die CloudStack-API-URL in Java
Treffen Sie Zaims API (OAuth 1.0) in Java
Analysieren der COTOHA-API-Syntaxanalyse in Java
Beispielcode zum Aufrufen der Yahoo! Local Search API in Java
Rufen Sie die Java-API von TensorFlow von Scala aus auf
JPA (Java Persistence API) in Eclipse
Rufen Sie die Super-Methode in Java auf
Beispielcode zum Aufrufen der Yahoo! Shopping Product Search (v3) -API mit der offiziell von Java 11 eingeführten HTTP-Client-API
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
Implementieren Sie API Gateway Lambda Authorizer in Java Lambda
Studieren Sie Java 8 (Datums-API im Paket java.time)
Rufen Sie die GitHub-API über Javas Socket-API Teil2 auf
Rufen Sie Java-Methoden aus JavaScript auf, das in Java ausgeführt wird
Versuchen Sie es mit der Stream-API in Java
Versuchen Sie es mit der JSON-Format-API in Java
Rufen Sie die visuelle Erkennung im Watson Java SDK auf
[Java] Neue Spezifikation Implementierung der Yahoo! -Produktsuch-API
Aufruf API [Aufruf]
Ich habe versucht, ein Tool zum Vergleichen von Amazon-Produktpreisen auf der ganzen Welt mit Java, der Amazon Product Advertising API und der Currency API (29.01.2017) zu erstellen.
ChatWork4j für die Verwendung der ChatWork-API in Java
[Java] API-Erstellung mit Jerjey (Jax-rs) mit Eclipse
Java-Methodenaufruf von RPG (Methodenaufruf in eigener Klasse)
[Java] Erstellen Sie so etwas wie eine Produktsuch-API
Senden Sie E-Mails mit Amazon SES SMTP in Java
Versuchen Sie, die Cloud Vision-API von GCP in Java zu verwenden
Versuchen Sie es mit der Syntaxanalyse der COTOHA-API in Java