Apitore blog

Apitoreを運営していた元起業家のブログ

ヤフーショッピングのAPIをJavaから呼び出す

はじめに

前回の記事ではヤフーショッピングのAPIを利用するための準備をしました。今回はSpring-webのRestTemplateと公開されたxsdファイルを使ってヤフーショッピングのAPIをJavaから呼び出してみようと思います。 amarec (20160806-170455)

APIを受けるクラスを自動生成する

自動生成したソースコードはGithubで公開しています。 xsdファイルが公開されているので、これを使ってxjcでソースコードを自動生成しようと思います。前回の記事でも書きましたが、このままではエラーがでてxjcを実行できないので修正します。修正箇所は前回の記事を、修正コードはGithubで確認してください。

$ xjc itemSearch.xsd

ResultSetクラスがヤフーショッピングのAPIを受けるクラスになります。

ヤフーショッピングAPIをJavaから呼び出す

ソースコードはGithubで公開しています。 Application IDとSecretは前回の記事を参照して取得しておいてください。 RestTemplateで呼び出すために、MapクラスでAPIのリクエストパラメータを管理します。リクエストパラメータについてはこちらにまとめてあります。

Map<String, String> params = new HashMap<String, String>();
params.put("appid", appid);
params.put("query", query);
params.put("category_id", category_id);
params.put("hits", HITS.toString());
params.put("offset", String.valueOf(HITS*(page-1)));
params.put("image_size", IMAGE_SIZE);
params.put("sort", sort);

「appid」は先述のApplication IDで、必須パラメーターです。 「query」は検索クエリで、必須パラメーターです。例えば「エアコン」を指定します。 「category_id」は商品ジャンルで、必須パラメーターです。指定できる値はこちらこちらで調べられます。後者はサンプルコードで指定できる商品ジャンルは全てではありませんが、主要な商品ジャンルは網羅しています。例えば、全体を指定する場合は「1」を、家電は「2505」を指定します。 「hits」は検索件数です。デフォルトは20で、最大50まで指定できます。 「offset」は件数のオフセットです。デフォルトは0です。例えば、「hits=10」で2ページ目の検索結果が欲しい場合は、「offset=10」とします。 「image_size」は取得する商品画像のサイズです。いくつか固定パラメータがあります。例えば「132」と指定します。 「sort」は検索結果のソート方法です。こちらのパラメータは公式には存在しませんが、どうやら指定できるようです。指定できるパラメータはこちらを参照してください。「-score」「%2Bprice」「-price」「-sold」くらいが使えればOKでしょう。それぞれ「おすすめ順」「価格の安い順」「価格の高い順」「売れてる順」です。 他にも指定できるパラメータはありますが、基本的な動作は上記で十分です。 次にRestTemplateで指定できるURLに変換します。

StringBuffer buffer = new StringBuffer();
for (Iterator<Entry<String,String>> it = params.entrySet().iterator(); it.hasNext();) {
  Map.Entry<String,String> entry = it.next();
  String key = entry.getKey();
  buffer.append(String.format("%s={%s}", key,key));
  if (it.hasNext()) {
    buffer.append("&");
  }
}
String url = String.format("%s?%s", endpoint, buffer.toString());

最後に、xsdファイルから自動生成したResultSetクラスでヤフーショッピングAPIのレスポンスを受け取ります。フェイルセーフのために多少の工夫を施しておきます。

ResultSet response = null;
int i=0;
while (i<5) {
  try {
    response = restTemplate.getForObject(url, ResultSet.class, params);
    break;
  } catch (RestClientException e) {
    LOG.error("RestClientException",e);
    response = new ResultSet();
    i++;
  }
  try {
    Thread.sleep(500);
  } catch (InterruptedException e) {
    LOG.error("InterruptedException",e);
  }
}

ResultSetで受け取るため、かなり便利にAPIレスポンスを扱えます。例えば、商品タイトルと価格を取得するには以下のようにします。

for (Hit hit: response.getResult().getHit()) {
  String title = hit.getName();
  String price = String.format("¥ %,3d", Integer.valueOf(hit.getPrice().getValue()) );
}

おわりに

以上でヤフーショッピングのAPIをJavaでコントロールするノウハウはおしまいです。Amazonや楽天のAPIもいじった上で思うのは、たとえSDKがなくてもxsdファイルがあればSDKを自動生成できるし、APIの扱いが著しく容易になるということです。xsdファイルを自分で書いたことがないのでどうやって作るのかはわかりませんが、レスポンスのXMLやJsonから自動生成できれば非常に便利だなと思います。・・・今のところ見つかっていませんが。ご存知のかたがいれば、ぜひ教えて下さい。

ソースコード