20200219のJavaに関する記事は5件です。

java 挿入ソート

java 挿入ソート

今回は挿入ソートについてコードを書いていく。
※自分のアウトプット用の記事です。間違いなどがあったら指摘してください。

InsetionSort.java
//トランプの手札の並び替えに似てる気がする。
public class InsertionSort {
    public static void sort(int[] array) {
        for(int i=1;i<array.length;i++) {
            int j=i;
            while(j>=1 && array[j-1]>array[j]) {
                int temp = array[j];
                array[j] = array[j-1];
                array[j-1] = temp;
                j--;
            }
        }
    }

    public static void main(String args[]) {
        int[] array = {3,2,4,5,1};
        sort(array);
        for(int i=0;i<array.length;i++) {
            System.out.print(array[i]);
        }
    }
}

次回はシェルソートを試してみようと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java Decompiler project の JD-GUI で JAR ファイルからソースコードを生成する

概要

  • Java Decompiler project の JD-GUI で JAR ファイルからソースコードを生成する
  • 今回の環境: macOS Catalina + Java 11 (AdoptOpenJDK 11.0.6)

JD-GUI とは

クラスファイルや JAR ファイルから Java のソースコードを生成する逆コンパイラ。
Java 5 以降に導入されたアノテーション、ジェネリクス、列挙型などもサポートしているとのこと。

Java Decompiler

JD-Core is a library that reconstructs Java source code from one or more “.class” files. JD-Core may be used to recover lost source code and explore the source of Java runtime libraries. New features of Java 5, such as annotations, generics or type “enum”, are supported. JD-GUI and JD-Eclipse include JD-Core library.

ダウンロードと実行

公式サイト Java Decompiler から jd-gui-1.6.6.jar をダウンロードする。

$ wget https://github.com/java-decompiler/jd-gui/releases/download/v1.6.6/jd-gui-1.6.6.jar

java コマンドで JD-GUI を起動する。

$ java -jar jd-gui-1.6.6.jar 

jd1.png

jar ファイルをドラッグ・アンド・ドロップすると Java のソースコードに変換してくれる。

jd2.png

メニューから File → Save All Sources でソースコードをまとめた zip ファイルを生成できる。

生成された zip ファイルを展開してみる。

$ unzip helloworldmod-1.2.3.jar.src.zip 
Archive:  helloworldmod-1.2.3.jar.src.zip
   creating: META-INF/
  inflating: META-INF/MANIFEST.MF    
  inflating: META-INF/mods.toml      
   creating: com/
   creating: com/example/
  inflating: com/example/HelloWorldMod.java  
  inflating: pack.mcmeta             

生成されたソースコードには jar ファイルのあったパスなどがコメントで埋め込まれている。

$ cat com/example/HelloWorldMod.java
/*    */ package com.example;
/*    */ 
/*    */ import net.minecraft.entity.player.PlayerEntity;
/*    */ import net.minecraft.util.math.BlockPos;
/*    */ import net.minecraft.util.text.ITextComponent;
/*    */ import net.minecraft.util.text.StringTextComponent;
/*    */ import net.minecraftforge.common.MinecraftForge;
/*    */ import net.minecraftforge.event.entity.player.PlayerEvent;
/*    */ import net.minecraftforge.eventbus.api.SubscribeEvent;
/*    */ import net.minecraftforge.fml.common.Mod;
/*    */ 
/*    */ 
/*    */ @Mod("helloworldmod")
/*    */ public class HelloWorldMod
/*    */ {
/*    */   public HelloWorldMod() {
/* 17 */     MinecraftForge.EVENT_BUS.register(this);
/*    */   }
/*    */ 
/*    */ 
/*    */ 
/*    */ 
/*    */ 
/*    */ 
/*    */   
/*    */   @SubscribeEvent
/*    */   public void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) {
/* 28 */     PlayerEntity player = event.getPlayer();
/* 29 */     BlockPos pos = player.func_180425_c();
/*    */ 
/*    */ 
/*    */     
/* 33 */     String message = "Hello, World!\n[name]=[" + player.func_200200_C_().func_150254_d() + "]\n[pos]=[" + pos.func_177958_n() + "," + pos.func_177956_o() + "," + pos.func_177952_p() + "]";
/* 34 */     StringTextComponent stringTextComponent = new StringTextComponent(message);
/* 35 */     player.func_145747_a((ITextComponent)stringTextComponent);
/*    */   }
/*    */ }


/* Location:              /Users/johndoe/hello/build/libs/helloworldmod-1.2.3.jar!/com/example/HelloWorldMod.class
 * Java compiler version: 8 (52.0)
 * JD-Core Version:       1.1.3
 */

参考資料

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

TrelloにJaveからAPIを使ってカードの起票や取得をしてみる

みんな大好きのタスク管理ツールTrelloは、ユーザインタフェースが使いやすく、見てすぐ使いこなせます。

そのTrelloと自分の作っているサービスを連携するためにTrello APIを簡単に使えないかを調べたのでまとめてみました。

1.準備

APIを発行するには、IDやパスワードの代わりになるキーとトークンの取得が必要です。
これらをまず取得します。

Trelloにログインします。

https://trello.com/app-key

にアクセスします。すると、キーが表示されますので、これをメモします。

01.png

その後、「トークン」をクリックして、下記のような画面が表示されるので、「許可」をクリックします。

02.png

下記のようにトークンが表示されますので、これをメモっておきます。

03.png

このキーとトークンを使い、APIを発行してTrelloにカード起票などを行ないます。

2.Javaのラッパーのライブラリを利用する

Githubにtrello-java-wrapperというライブラリがあるので、そちらを利用します。

GithubのページにはGradleで記載されていますが、Mavenにもありますので、こちらを利用します。

<!-- https://mvnrepository.com/artifact/com.taskadapter/trello-java-wrapper -->
<dependency>
    <groupId>com.taskadapter</groupId>
    <artifactId>trello-java-wrapper</artifactId>
    <version>0.13</version>
</dependency>

まず、TrelloImplのインスタンスを作成します。この例では、Apache Httpライブラリに基づいたhttpクライアントを使用しています。

Trello trelloApi = new TrelloImpl(trelloKey, trelloAccessToken, new ApacheHttpClient());
  • trelloKey:Trelloで認証されたユーザーのoauthトークン。
  • trelloAccessToken:Trelloで認証されたユーザーのoauthトークン。
  • ApacheHttpClient:サポートされているhttpクライアントの1つ。 ※com.julienvey.trello.impl.httpのパッケージを参照してください。

ちなみに以下のようなエラーが発生する場合は、

Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/exc/InputCoercionException

Mavenで「com.fasterxml.jackson.core」を追加すると直るかと思います。

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.10.2</version>
</dependency>

3.ボードの一覧を取得する

まずは、ボードの一覧取得はこうなります。
メンバーIDの指定を"me"と記載すると自分自身のボードがすべて取得できます。

List <Board> boards = trelloApi.getMemberBoards("me", new Argument("fields", "name"));

パラメータに以下を指定しているのは、ボード名が取得できないので、指定する必要があります。

new Argument("fields", "name")

4.リストとカードの一覧を取得する

こちらがボード内のリストを取得する方法になります。

List <TList> lists = trelloApi.getBoardLists(boardId);
  • boardId:取得したボードIDを指定。

こちらがリスト内のカードを取得する方法になります。

List <Card> cards = trelloApi.getListCards(listId);
  • listId:取得したリストIDを指定。

ちなみにこんな感じでコーディングするとすべてのカードが取得できたりします。

List <Board> boards = trelloApi.getMemberBoards("me", new Argument("fields", "name"));
for (Board board : boards) {
    board.getName();
    board.getId();
    System.out.println(board.getId() + ":" + board.getName());
    List <TList> lists = trelloApi.getBoardLists(board.getId());
    for (TList list : lists) {
        System.out.println(list.getId() + ":" + list.getName());
        List <Card> cards = trelloApi.getListCards(list.getId());
        for (Card card : cards) {
            System.out.println(card.getId() + ":" + card.getName());
        }
    }
}

5.カードを起票する

カードを起票する場合はこのように記載します。

Card card = new Card();
card.setName("あいうえお");
card = trelloApi.createCard(listId, card); // 登録
card.addComment("コメントを記載");
card = card.update(); // 更新
card.delete(); // 削除
  • listId:取得したリストIDを指定。

新規でカードを登録する場合はcreateCardでカードを作成して、更新する場合はupdate、削除の場合はdeleteを指定します。

6.終わりに

trello-java-wrapperには、一通りのAPIの呼び出しに対応していますので、簡単にJavaからTrelloのAPIを呼び出すことができます。
もし、Trelloをお使いでしたら試してみてはいかがでしょうか。

以下、参考サイト
https://became-free.com/how-to-use-trello-api/
http://blog.serverworks.co.jp/tech/2016/05/16/trello-api/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Cosmos DBに大量にデータを入れてみる

ちょっとした検証目的のため、Cosmos DBに大量データを投じる簡易的なサンプルJavaコードを作成してみました。
当然ながら大量のトランザクションが走ると課金額も増加するため、ご利用は自己責任にてお願いします。

https://github.com/yahanda/cosmosdb-testdata-generator

使用方法

1) ニューヨーク市の Taxi and Limousine Commission のページより、Yellowタクシーの乗降データをダウンロードし、任意のフォルダーに配置します。(例:C:\\Temp\\
2) Eclipseで pom.xml をロードし、Javaパースペクティブを開きます。
3) appsettings.properties を開き、以下のプロパティー値をご自身のCosmos DB環境にあわせて更新します。CsvFileDirには、手順 1) で CSVファイルを配置したフォルダーを指定します。

EndPointUrl=https://REPLACE_ME_WITH_YOURS.documents.azure.com:443/
PrimaryKey=REPLACE_ME_WITH_YOURS
Database=TestDB
Collection=TestCollection
CsvFileDir=C:\\Temp\\

4) GenerateNYCTaxiData.java をJava Applicationとして実行します。

実行例
Created a new database:
{"_rid":"DewXAA==","id":"TestDB","_self":"dbs/DewXAA==/","_colls":"colls/","_users":"users/","_etag":"\"00002908-0000-2300-0000-5e4cf35e0000\"","_ts":1582101343}
Press any key to continue..

Created a new collection:
{"uniqueKeyPolicy":{"uniqueKeys":[]},"geospatialConfig":{"type":"Geography"},"_rid":"DewXAIlOilc=","_sprocs":"sprocs/","_triggers":"triggers/","_udfs":"udfs/","conflictResolutionPolicy":{"mode":"LastWriterWins","conflictResolutionProcedure":"","conflictResolutionPath":"/_ts"},"_docs":"docs/","partitionKey":{"paths":["/_partitionKey"],"kind":"Hash"},"indexingPolicy":{"indexingMode":"consistent","automatic":true,"includedPaths":[{"path":"/*"}],"excludedPaths":[{"path":"/\"_etag\"/?"}]},"id":"TestCollection","_self":"dbs/DewXAA==/colls/DewXAIlOilc=/","_conflicts":"conflicts/","_etag":"\"00001f05-0000-2300-0000-5e4cf3620000\"","_ts":1582101346}
Press any key to continue..
Read a csv file:
C:\Temp\yellow_tripdata_2019-01.csv
Press any key to continue..

Header: VendorID,tpep_pickup_datetime,tpep_dropoff_datetime,passenger_count,trip_distance,RatecodeID,store_and_fwd_flag,PULocationID,DOLocationID,payment_type,fare_amount,extra,mta_tax,tip_amount,tolls_amount,improvement_surcharge,total_amount,congestion_surcharge
Created 1 document:
{"_rid":"DewXAIlOilcBAAAAAAAAAA==","puLocationid":"151","fare_amount":"7","tpep_dropoff_datetime":"2019-01-01 00:53:20","congestion_surcharge":"","vendorid":"1","passenger_count":"1","tolls_amount":"0","improvement_surcharge":"0.3","trip_distance":"1.50","_attachments":"attachments/","store_and_fwd_flag":"N","payment_type":"1","ratecodeid":"1","total_amount":"9.95","extra":"0.5","tip_amount":"1.65","mta_tax":"0.5","id":"92ce47d1-b876-443e-8e47-d1b876643e4a","_self":"dbs/DewXAA==/colls/DewXAIlOilc=/docs/DewXAIlOilcBAAAAAAAAAA==/","doLocationid":"239","tpep_pickup_datetime":"2019-01-01 00:46:40","_etag":"\"00003108-0000-2300-0000-5e4cf3660000\"","_ts":1582101350}
Created 2 document:
{"_rid":"DewXAIlOilcCAAAAAAAAAA==","puLocationid":"239","fare_amount":"14","tpep_dropoff_datetime":"2019-01-01 01:18:59","congestion_surcharge":"","vendorid":"1","passenger_count":"1","tolls_amount":"0","improvement_surcharge":"0.3","trip_distance":"2.60","_attachments":"attachments/","store_and_fwd_flag":"N","payment_type":"1","ratecodeid":"1","total_amount":"16.3","extra":"0.5","tip_amount":"1","mta_tax":"0.5","id":"14a612b4-4eac-4aa3-a612-b44eacdaa3b6","_self":"dbs/DewXAA==/colls/DewXAIlOilc=/docs/DewXAIlOilcCAAAAAAAAAA==/","doLocationid":"246","tpep_pickup_datetime":"2019-01-01 00:59:47","_etag":"\"00003208-0000-2300-0000-5e4cf3660000\"","_ts":1582101350}
Created 3 document:
{"_rid":"DewXAIlOilcDAAAAAAAAAA==","puLocationid":"236","fare_amount":"4.5","tpep_dropoff_datetime":"2018-12-21 13:52:40","congestion_surcharge":"","vendorid":"2","passenger_count":"3","tolls_amount":"0","improvement_surcharge":"0.3","trip_distance":".00","_attachments":"attachments/","store_and_fwd_flag":"N","payment_type":"1","ratecodeid":"1","total_amount":"5.8","extra":"0.5","tip_amount":"0","mta_tax":"0.5","id":"69d7e305-53e1-4efd-97e3-0553e18efd36","_self":"dbs/DewXAA==/colls/DewXAIlOilc=/docs/DewXAIlOilcDAAAAAAAAAA==/","doLocationid":"236","tpep_pickup_datetime":"2018-12-21 13:48:30","_etag":"\"00003308-0000-2300-0000-5e4cf3660000\"","_ts":1582101350}
Created 4 document:
{"_rid":"DewXAIlOilcEAAAAAAAAAA==","puLocationid":"193","fare_amount":"3.5","tpep_dropoff_datetime":"2018-11-28 15:55:45","congestion_surcharge":"","vendorid":"2","passenger_count":"5","tolls_amount":"0","improvement_surcharge":"0.3","trip_distance":".00","_attachments":"attachments/","store_and_fwd_flag":"N","payment_type":"2","ratecodeid":"1","total_amount":"7.55","extra":"0.5","tip_amount":"0","mta_tax":"0.5","id":"3cb3e88a-da63-4060-b3e8-8ada63d060b3","_self":"dbs/DewXAA==/colls/DewXAIlOilc=/docs/DewXAIlOilcEAAAAAAAAAA==/","doLocationid":"193","tpep_pickup_datetime":"2018-11-28 15:52:25","_etag":"\"00003408-0000-2300-0000-5e4cf3660000\"","_ts":1582101350}
Created 5 document:
{"_rid":"DewXAIlOilcFAAAAAAAAAA==","puLocationid":"193","fare_amount":"52","tpep_dropoff_datetime":"2018-11-28 15:58:33","congestion_surcharge":"","vendorid":"2","passenger_count":"5","tolls_amount":"0","improvement_surcharge":"0.3","trip_distance":".00","_attachments":"attachments/","store_and_fwd_flag":"N","payment_type":"2","ratecodeid":"2","total_amount":"55.55","extra":"0","tip_amount":"0","mta_tax":"0.5","id":"ff1002e6-03f5-4bac-9002-e603f5cbacf5","_self":"dbs/DewXAA==/colls/DewXAIlOilc=/docs/DewXAIlOilcFAAAAAAAAAA==/","doLocationid":"193","tpep_pickup_datetime":"2018-11-28 15:56:57","_etag":"\"00003508-0000-2300-0000-5e4cf3660000\"","_ts":1582101350}
Created 6 document:
{"_rid":"DewXAIlOilcGAAAAAAAAAA==","puLocationid":"193","fare_amount":"3.5","tpep_dropoff_datetime":"2018-11-28 16:28:26","congestion_surcharge":"","vendorid":"2","passenger_count":"5","tolls_amount":"5.76","improvement_surcharge":"0.3","trip_distance":".00","_attachments":"attachments/","store_and_fwd_flag":"N","payment_type":"2","ratecodeid":"1","total_amount":"13.31","extra":"0.5","tip_amount":"0","mta_tax":"0.5","id":"3cf17f8b-617e-49a4-b17f-8b617e29a49c","_self":"dbs/DewXAA==/colls/DewXAIlOilc=/docs/DewXAIlOilcGAAAAAAAAAA==/","doLocationid":"193","tpep_pickup_datetime":"2018-11-28 16:25:49","_etag":"\"00003608-0000-2300-0000-5e4cf3660000\"","_ts":1582101350}
Created 7 document:

:

image.png

参考情報

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Amazon Product Advertising API 5.0 (PA-API v5) の SDK (paapi5-java-sdk-1.0.0) を使う

概要

  • Java から Amazon Product Advertising API 5.0 (PA-API v5) を使用する
  • API を直接コールせず AWS が提供している公式の SDK (paapi5-java-sdk-1.0.0) を使用する
  • 今回の実行環境: macOS Catalina + Java 8 + Gradle 6.1

paapi5-java-sdk-1.0.0 のダウンロード

paapi5-java-sdk-1.0.0 は Maven Central Repository などで配布されていないため、 jar ファイルをダウンロードして使う。

Using SDK · Product Advertising API 5.0 から paapi5-java-sdk-example.zip をダウンロードして展開する。

sdk ディレクトリには paapi5-java-sdk-1.0.0 を使用するサンプルコードが入っている。

$ ls ./sdk/ | sort
Callback.java
ConnectionPoolSampleRequest.java
GetBrowseNodes.java
GetBrowseNodesAsync.java
GetBrowseNodesWithHttpInfo.java
GetItems.java
GetItemsAsync.java
GetItemsWithHttpInfo.java
GetVariations.java
GetVariationsAsync.java
GetVariationsWithHttpInfo.java
SearchItems.java
SearchItemsAsync.java
SearchItemsWithHttpInfo.java

dependencies ディレクトリには SDK である paapi5-java-sdk-1.0.0.jar とその依存ライブラリの jar ファイルが入っている。

$ ls ./dependencies/ | sort
commons-codec-1.11.jar
commons-logging-1.2.jar
gson-2.8.1.jar
gson-fire-1.8.0.jar
hamcrest-core-1.3.jar
httpclient-4.5.5.jar
httpcore-4.4.9.jar
jackson-annotations-2.9.0.jar
jackson-core-2.9.5.jar
jackson-core-asl-1.9.2.jar
jackson-databind-2.9.3.jar
jackson-mapper-asl-1.9.2.jar
jackson-xc-1.9.2.jar
jackson-xml-databind-0.6.2.jar
json-20180130.jar
junit-4.12.jar
logging-interceptor-2.7.5.jar
okhttp-2.7.5.jar
okio-1.6.0.jar
paapi5-java-sdk-1.0.0.jar
stax-api-1.0-2.jar
stax2-api-3.1.0.jar
swagger-annotations-1.5.15.jar
threetenbp-1.3.5.jar

paapi5-java-sdk-1.0.0.jar ファイルを展開して pom.xml を見ると依存情報が載っているので、依存ライブラリについての設定はこれを参考にする。

以下に META-INF/maven/com.amazon.paapi5/paapi5-java-sdk/pom.xml より依存情報を一部抜粋する。

<dependencies>
    <dependency>
        <groupId>io.swagger</groupId>
        <artifactId>swagger-annotations</artifactId>
        <version>${swagger-core-version}</version>
    </dependency>
    <dependency>
        <groupId>com.squareup.okhttp</groupId>
        <artifactId>okhttp</artifactId>
        <version>${okhttp-version}</version>
    </dependency>
    <dependency>

paapi5-java-sdk-1.0.0 を使うサンプルコード

ファイル一覧

今回はダウンロードした paapi5-java-sdk-1.0.0.jar を libs ディレクトリ以下に置く。

├── build.gradle
├── libs
│   └── paapi5-java-sdk-1.0.0.jar
├── settings.gradle
└── src
    └── main
        └── java
            └── com
                └── example
                    └── App.java

build.gradle

Gradle の設定ファイル。

plugins {
  id 'java'
  id 'application'
}

repositories {
  mavenCentral()
}

dependencies {

  // ダウンロードした paapi5-java-sdk
  implementation files('libs/paapi5-java-sdk-1.0.0.jar')

  // paapi5-java-sdk が依存しているライブラリ (paapi5-java-sdk-1.0.0.jar の pom.xml を参考にした)
  implementation 'io.swagger:swagger-annotations:1.5.15'
  implementation 'com.squareup.okhttp:okhttp:2.7.5'
  implementation 'com.squareup.okhttp:logging-interceptor:2.7.5'
  implementation 'com.google.code.gson:gson:2.8.1'
  implementation 'io.gsonfire:gson-fire:1.8.0'
  implementation 'org.threeten:threetenbp:1.3.5'
}

application {
  mainClassName = 'com.example.App'
}

sourceCompatibility = targetCompatibility = '1.8'

settings.gradle

Gradle の設定ファイル。

rootProject.name = 'hello-amazon-pa-api-world'

App.java

paapi5-java-sdk-1.0.0 を使うサンプルプログラム。

package com.example;

import com.amazon.paapi5.v1.ApiClient;
import com.amazon.paapi5.v1.ApiException;
import com.amazon.paapi5.v1.ByLineInfo;
import com.amazon.paapi5.v1.Contributor;
import com.amazon.paapi5.v1.ErrorData;
import com.amazon.paapi5.v1.GetItemsRequest;
import com.amazon.paapi5.v1.GetItemsResource;
import com.amazon.paapi5.v1.GetItemsResponse;
import com.amazon.paapi5.v1.Item;
import com.amazon.paapi5.v1.PartnerType;
import com.amazon.paapi5.v1.SearchItemsRequest;
import com.amazon.paapi5.v1.SearchItemsResource;
import com.amazon.paapi5.v1.SearchItemsResponse;
import com.amazon.paapi5.v1.api.DefaultApi;

import java.util.ArrayList;
import java.util.List;

public class App {

  public static void main(String[] args) {

    ApiClient client = new ApiClient();
    client.setAwsAccessKey("<YOUR-ACCESS-KEY-HERE>"); // 取得したアクセスキー
    client.setAwsSecretKey("<YOUR-SECRET-KEY-HERE>"); // 取得したシークレットキー
    client.setHost("webservices.amazon.co.jp"); // Amazon.co.jp の Web API ホスト
    client.setRegion("us-west-2"); // Amazon.co.jp では us-west-2 を指定

    String trackingId = "<YOUR-PARTNER-TAG-HERE>"; // 取得したトラッキングID

    // キーワードから商品を検索
    System.out.println("===== searchItems ================================");
    String keywords = "シェイクスピア";
    searchItems(client, trackingId, keywords);

    // ASIN から商品情報を取得
    System.out.println("===== getItems ===================================");
    List<String> itemIds = new ArrayList<>();
    itemIds.add("4391641585");
    itemIds.add("B010EB1HR4");
    itemIds.add("B0125SPF90");
    itemIds.add("B07V52KSGT");
    getItems(client, trackingId, itemIds);
  }

  // キーワードから商品を検索
  public static void searchItems(ApiClient client, String trackingId, String keywords) {

    // レスポンスに含む値のタイプを指定
    // https://webservices.amazon.com/paapi5/documentation/search-items.html#resources-parameter
    List<SearchItemsResource> searchItemsResources = new ArrayList<SearchItemsResource>();
    searchItemsResources.add(SearchItemsResource.ITEMINFO_TITLE);
    searchItemsResources.add(SearchItemsResource.ITEMINFO_PRODUCTINFO);
    searchItemsResources.add(SearchItemsResource.IMAGES_PRIMARY_MEDIUM);
    searchItemsResources.add(SearchItemsResource.OFFERS_LISTINGS_PRICE);

    // リクエスト情報を組み立てる
    SearchItemsRequest req = new SearchItemsRequest()
      .itemCount(5) // 検索結果の数
      .partnerTag(trackingId) // トラッキングID
      .keywords(keywords) // 検索キーワード
      .searchIndex("All") // 検索カテゴリー (AmazonVideo, Books, Hobbies, Music などを指定可能)
      .resources(searchItemsResources) // レスポンスに含む値のタイプ
      .partnerType(PartnerType.ASSOCIATES);

    try {
      // 検索を実行
      DefaultApi api = new DefaultApi(client);
      SearchItemsResponse res = api.searchItems(req);

      // 結果を取得
      if (res.getSearchResult() != null) {
        for (Item item : res.getSearchResult().getItems()) {
          System.out.println("--------------------------------------------------");
          // タイトル, ASIN, 商品URL
          System.out.println("Title: " + item.getItemInfo().getTitle().getDisplayValue());
          System.out.println("ASIN: " + item.getASIN());
          System.out.println("DetailPageURL: " + item.getDetailPageURL());
          // アダルト商品かどうか
          System.out.println("IsAdultProduct: " + item.getItemInfo().getProductInfo().getIsAdultProduct().isDisplayValue());
          // 画像URL
          System.out.println("ImageURL: " + item.getImages().getPrimary().getMedium().getURL());
          // 価格
          if (item.getOffers() != null
            && item.getOffers().getListings() != null
            && item.getOffers().getListings().get(0).getPrice() != null
            && item.getOffers().getListings().get(0).getPrice().getDisplayAmount() != null) {
            System.out.println("Price: " + item.getOffers().getListings().get(0).getPrice().getDisplayAmount());
          }
        }
      }
      // エラー処理
      if (res.getErrors() != null) {
        for (ErrorData error : res.getErrors()) {
          System.out.println("Error code: " + error.getCode());
          System.out.println("Error message: " + error.getMessage());
        }
      }
    } catch (ApiException e) {
      // エラー処理
      e.printStackTrace();
      System.out.println("Status code: " + e.getCode());
      System.out.println("Errors: " + e.getResponseBody());
      System.out.println("Message: " + e.getMessage());
      if (e.getResponseHeaders() != null) {
        System.out.println("Request ID: " + e.getResponseHeaders().get("x-amzn-RequestId"));
      }
    } catch (Exception e) {
      // エラー処理
      e.printStackTrace();
    }
  }

  // ASIN から商品情報を取得
  public static void getItems(ApiClient client, String trackingId, List<String> asinList) {

    // レスポンスに含む値のタイプを指定
    // https://webservices.amazon.com/paapi5/documentation/get-items.html#resources-parameter
    List<GetItemsResource> getItemsResources = new ArrayList<GetItemsResource>();
    getItemsResources.add(GetItemsResource.ITEMINFO_TITLE);
    getItemsResources.add(GetItemsResource.ITEMINFO_BYLINEINFO);

    // リクエスト情報を組み立てる
    GetItemsRequest req = new GetItemsRequest()
      .itemIds(asinList) // ASIN のリスト
      .partnerTag(trackingId) // トラッキングID
      .resources(getItemsResources) // レスポンスに含む値のタイプ
      .partnerType(PartnerType.ASSOCIATES);

    try {
      // 検索を実行
      DefaultApi api = new DefaultApi(client);
      GetItemsResponse res = api.getItems(req);

      // 結果を取得
      if (res.getItemsResult() != null) {
        for (Item item : res.getItemsResult().getItems()) {
          System.out.println("--------------------------------------------------");
          // タイトル, ASIN, 商品URL
          System.out.println("Title: " + item.getItemInfo().getTitle().getDisplayValue());
          System.out.println("ASIN: " + item.getASIN());
          System.out.println("DetailPageURL: " + item.getDetailPageURL());
          // 著者などの貢献者情報
          ByLineInfo bi = item.getItemInfo().getByLineInfo();
          if (bi != null && bi.getContributors() != null) {
            for (Contributor c : bi.getContributors()) {
              System.out.println("Contributor: " + c.getRole() + ": " + c.getName());
            }
          }
        }
      }
      // エラー処理
      if (res.getErrors() != null) {
        for (ErrorData error : res.getErrors()) {
          System.out.println("Error code: " + error.getCode());
          System.out.println("Error message: " + error.getMessage());
        }
      }
    } catch (ApiException e) {
      // エラー処理
      e.printStackTrace();
      System.out.println("Status code: " + e.getCode());
      System.out.println("Errors: " + e.getResponseBody());
      System.out.println("Message: " + e.getMessage());
      if (e.getResponseHeaders() != null) {
        System.out.println("Request ID: " + e.getResponseHeaders().get("x-amzn-RequestId"));
      }
    } catch (Exception e) {
      // エラー処理
      e.printStackTrace();
    }
  }
}

サンプルコードの実行結果

実行環境: macOS Catalina + Gradle 6.1 + Java 8 (AdoptOpenJDK 1.8.0_242-b08)

$ gradle run

> Task :run
===== searchItems ================================
--------------------------------------------------
Title: 7人のシェイクスピア NON SANZ DROICT(11) (ヤングマガジンコミックス)
ASIN: B084BP9ZD9
DetailPageURL: https://www.amazon.co.jp/dp/B084BP9ZD9?tag=<YOUR-PARTNER-TAG-HERE>&linkCode=osi&th=1&psc=1
IsAdultProduct: false
ImageURL: https://m.media-amazon.com/images/I/51KrT7qGuOL._SL160_.jpg
Price: ¥660
--------------------------------------------------
Title: シェイクスピア全集 (1) ハムレット (ちくま文庫)
ASIN: 4480033017
DetailPageURL: https://www.amazon.co.jp/dp/4480033017?tag=<YOUR-PARTNER-TAG-HERE>&linkCode=osi&th=1&psc=1
IsAdultProduct: false
ImageURL: https://m.media-amazon.com/images/I/51RZYRYGQ8L._SL160_.jpg
Price: ¥726
--------------------------------------------------
Title: ハムレット(字幕版)
ASIN: B015BY1Q6Q
DetailPageURL: https://www.amazon.co.jp/dp/B015BY1Q6Q?tag=<YOUR-PARTNER-TAG-HERE>&linkCode=osi&th=1&psc=1
IsAdultProduct: false
ImageURL: https://m.media-amazon.com/images/I/516XD+o35gL._SL160_.jpg
Price: ¥400
--------------------------------------------------
Title: あらすじで読むシェイクスピア全作品 (祥伝社新書)
ASIN: B06ZZH149Y
DetailPageURL: https://www.amazon.co.jp/dp/B06ZZH149Y?tag=<YOUR-PARTNER-TAG-HERE>&linkCode=osi&th=1&psc=1
IsAdultProduct: false
ImageURL: https://m.media-amazon.com/images/I/41Ms+C0NwNL._SL160_.jpg
Price: ¥836
--------------------------------------------------
Title: 第8話
ASIN: B07WPX7D76
DetailPageURL: https://www.amazon.co.jp/dp/B07WPX7D76?tag=<YOUR-PARTNER-TAG-HERE>&linkCode=osi&th=1&psc=1
IsAdultProduct: false
ImageURL: https://m.media-amazon.com/images/I/517ol4X4BwL._SL160_.jpg
===== getItems ===================================
--------------------------------------------------
Title: すみっコぐらし検定公式ガイドブック すみっコぐらし大図鑑 (生活シリーズ)
ASIN: 4391641585
DetailPageURL: https://www.amazon.co.jp/dp/4391641585?tag=<YOUR-PARTNER-TAG-HERE>&linkCode=ogi&th=1&psc=1
Contributor: 監修: サンエックス
Contributor: 編集: 主婦と生活社
--------------------------------------------------
Title: 守護神伝 第二章 <エクスパンデッド・エディション>(リマスター)
ASIN: B010EB1HR4
DetailPageURL: https://www.amazon.co.jp/dp/B010EB1HR4?tag=<YOUR-PARTNER-TAG-HERE>&linkCode=ogi&th=1&psc=1
Contributor: アーティスト: ハロウィン
--------------------------------------------------
Title: ハロウィン ロッキング パンプキン ホームデコレーション用小物 H 130cm
ASIN: B0125SPF90
DetailPageURL: https://www.amazon.co.jp/dp/B0125SPF90?tag=<YOUR-PARTNER-TAG-HERE>&linkCode=ogi&th=1&psc=1
--------------------------------------------------
Title: ハロウィン (字幕版)
ASIN: B07V52KSGT
DetailPageURL: https://www.amazon.co.jp/dp/B07V52KSGT?tag=<YOUR-PARTNER-TAG-HERE>&linkCode=ogi&th=1&psc=1
Contributor: 出演: ジェイミー・リー・カーティス
Contributor: 出演: ジュディ・グリア
Contributor: 出演: アンディ・マティチャック
Contributor: 出演: ウィル・パットン
Contributor: 出演: ヴァージニア・ガードナー
Contributor: 出演: ニック・キャッスル
Contributor: 出演: ジェームス・ジュード・コートニー
Contributor: 出演: ハルク・ビルギナー
Contributor: 出演: リアン・リース
Contributor: 出演: ジェファーソン・ホール
Contributor: 監督: デヴィッド・ゴードン・グリーン
Contributor: Writer: デヴィッド・ゴードン・グリーン
Contributor: Writer: ジェフ・フラッドリー
Contributor: Writer: ダニー・マクブライド
Contributor: プロデュース: マレク・アカッド
Contributor: プロデュース: ジェイソン・ブラム
Contributor: プロデュース: ビル・ブロック

BUILD SUCCESSFUL in 3s
2 actionable tasks: 2 executed

参考資料

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む