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

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

ユーザー登録は[こちら](https://metadata.co.jp/apis/what-cat.html)から登録を行ってください。

# 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;
    }

}
```