Java
jersey
springframework

SpringFrameworkでAPIで画像登録する機能を作ってみた。その2(クライアント編)

APIを作ったので接続してみる。

APIの作り方はこちら

Jerseyを使って接続する。

作ったクライアントの全体像はこんな感じ

ImageIOController.java
    @RequestMapping(value = "/imageCompleteApi", method = RequestMethod.POST)
    public ModelAndView imageUploadCompleteApi(ImageUploadFormApi imageUploadFormApi,
            Principal principal) {

        //認証情報を取得する
        Authentication auth = (Authentication)principal;
        LoginUserDetails LoginUser = (LoginUserDetails)auth.getPrincipal();

        //バイナリデータを取得
        Integer FileSize = (int) (imageUploadFormApi.getImage().getSize());
        byte[] imageBinary = new byte[FileSize];

        try {
             imageBinary = imageUploadFormApi.getImage().getBytes();
        } catch (IOException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }

        //Request準備
        PictureMaster pictureMaster = new PictureMaster();

        pictureMaster.setOriginalName(imageUploadFormApi.getImage().getOriginalFilename());
        pictureMaster.setPictureName(imageUploadFormApi.getFilename());
        pictureMaster.setExtension(imageUploadFormApi.getImage().getOriginalFilename()
                .substring(imageUploadFormApi.getImage().getOriginalFilename().length() - 4, imageUploadFormApi.getImage().getOriginalFilename().length()));
        pictureMaster.setBase64string(Base64.getEncoder().encodeToString(imageBinary));
        pictureMaster.setUploadUserId(LoginUser.getUserId());
        //APIを呼び出して画像を登録


        ObjectMapper mapper = new ObjectMapper();

        Entity<String> requestBody = null;
        String result = null;

        //ヘッダーを設定する。
        MultivaluedMap<String, Object> headers = new MultivaluedHashMap<>();
        headers.putSingle("X-SUBDOMEIN", "api");

        try {
            requestBody = Entity.json(mapper.writeValueAsString(pictureMaster));

            //自分サーバーへのAPIにポストリクエストを送る。
            Client client = ClientBuilder.newClient();
            WebTarget target = client.target("http://api.localhost:8080")
                    .path("/WebAquarium3.1/api/picture/addPicture");

            result = target
                    .request()
                    .headers(headers)
                    .post(requestBody, String.class);


        } catch (IOException e1) {
            // TODO 自動生成された catch ブロック
            e1.printStackTrace();
        }


        //受け取ったJSONをクラスに変換

        System.out.println(result);
        ModelAndView mv = new ModelAndView("ImageComplete");
        return mv;
    }

前半は取得したデータをDBに合わせて加工しているだけですね。
大事なのは

ImageIOController.java
ObjectMapper mapper = new ObjectMapper();

からの処理ですね。

処理の流れはこんな感じです。
1.APIに必要なヘッダーを設定する。
2.リクエストEntity用意する
3.ヘッダーとリクエストを設定してPOSTを実行する。

まずここで、リクエストをJson形式に変換して準備します。

1.APIに必要なヘッダーを設定する。

ImageController.java
        //ヘッダーを設定する。
        MultivaluedMap<String, Object> headers = new MultivaluedHashMap<>();
        headers.putSingle("X-SUBDOMEIN", "api");

リクエストに必要なヘッダーを設定してあげます。
MultivaluedHashMapJersey用のヘッダークラスですね

2.リクエストEntity用意する

ImageController.java
            requestBody = Entity.json(mapper.writeValueAsString(pictureMaster));

次にEntityクラスにJsonデータを設定します。
JsonデータはJacksonを使って生成しています。

3.ヘッダーとリクエストを設定してPOSTを実行する。

ImageController.java
            //自分サーバーへのAPIにポストリクエストを送る。
            Client client = ClientBuilder.newClient();
            WebTarget target = client.target("http://api.localhost:8080")
                    .path("/WebAquarium3.1/api/picture/addPicture");

            result = target
                    .request()
                    .headers(headers)
                    .post(requestBody, String.class);

まずはClientBuilderWebTargetを使って、
どのドメインのどのアドレスに接続するのかを設定してあげます

そして、headersにとpostにヘッダーとポストを設定します。
最後のString.classは最終的な「レスポンスを文字列で受け取りますよ」という意味です。

JerseyProviderというものを設定すれば独自クラスでも取得できるそうなのですが、今回はやりません(めんどくさ(ry)

れっつ接続

それでは接続してみましょう。

画面の操作はちょっと省きます。;つД`)

レスポンスが帰ってきてるのが確認できています。
image.png

画像がDBに登録されました!
image.png