Edited at

メタデータ株式会社のこの猫なに猫APIをJavaで呼び出す。


1.はじめに

メタデータ株式会社のユーザー登録を行い、ユーザーIDとパスワードを設定する必要があります。

ユーザー登録はこちらから登録を行ってください。


2.APIと連携する

APIの連携しようがいまいちわからなかったが、色々と試して以下のソースに落ち着いた。

POSTで通信するみたいで、imageの部分に画像データを設定するとうまくJSONが返ってくる。

画像データはByteで送るように作ってみたので、こちらをアプリに取り込んでみますか。


pom.xml

<dependency>

<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.10</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.10</version>
</dependency>


WhatCat.java

import java.io.IOException;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.HttpClientBuilder;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
* この猫なに猫?API.
*
* @author H.Aoshima
* @version 1.0
*
*/

public final class WhatCat {

/**
* URI.
*/

private static final String SUGGETS_URL = "http://whatcat.ap.mextractr.net/api_query";

/**
* 実行.
* @param bytes 画像データ
* @param fileName 画像ファイル名
* @param userName ユーザ名
* @param password パスワード
* @return 判定結果
* @throws ClientProtocolException クライアントプロトコル例外
* @throws IOException IO例外
*/

public static List<Object> exec(final byte[] bytes, final String fileName, final String userName, final String password)
throws ClientProtocolException, IOException {

// 返り値
List result = null;

// クライアント作成
final HttpClient client = HttpClientBuilder.create().build();
// エンコード前にバイト配列に置き換える際のCharset
final Charset charset = StandardCharsets.UTF_8;
// エンコードしたい文字列
final String source = userName + ":" + password;
// エンコード処理
final String encoding = Base64.getEncoder().encodeToString(source.getBytes(charset));
final HttpPost post = new HttpPost(WhatCat.SUGGETS_URL);
post.setHeader("Authorization", "Basic " + encoding);

// MultipartEntityBuilderiに画像の値を設定
final MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addBinaryBody("image", bytes, ContentType.MULTIPART_FORM_DATA, fileName);

post.setEntity(builder.build());

// レスポンスを取得
final HttpResponse response = client.execute(post);
final HttpEntity responseEntity = response.getEntity();

if (response.getStatusLine().getStatusCode() == 200) {
// 値の取得
final InputStream is = responseEntity.getContent();
final Reader r = new InputStreamReader(is, charset);

ObjectMapper mapper = new ObjectMapper();
result = mapper.readValue(r, new TypeReference<List<Object>>() {});
}

return result;
}

}