m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

Spring BootのRestTemplateでバイナリデータを取得する

RestTemplate

Spring BootのAPI処理クラスと思われる

Rest APIの場合は基本JSONなんだけど

APIの結果としてはバイナリデータを受け取る場合もあるので取得したい

動作用API

LINE APIのGet ContentAPIを使用
https://devdocs.line.me/ja/?shell#get-content

実装サンプル

pom.xml
        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-io -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.3.2</version>
        </dependency>
App
** RestTemplate
Spring BootのAPI処理クラスと思われる

** 実装サンプル
*** App
>|java|
package com.example;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;

import org.apache.commons.io.IOUtils;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.ByteArrayHttpMessageConverter;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class SampleSpringResttemplate01Application {

    public static void main(String[] args) throws IOException {
        SpringApplication.run(SampleSpringResttemplate01Application.class, args);
        
        // インスタンス生成
        RestTemplate restTemplate = new RestTemplate();

        // メッセージコンバーター設定
        restTemplate.getMessageConverters().add(new ByteArrayHttpMessageConverter());

        // ヘッダー設定
        HttpHeaders headers = new HttpHeaders();
        headers.setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM));
        headers.add("Authorization", "Bearer " + "アクセストークン");

        // パラメータ設定
        HttpEntity<String> entity = new HttpEntity<String>(headers);

        // URL
        String url;
        url = "https://api.line.me/v2/bot/message/999999999999999/content";

        // リクエスト発行
        ResponseEntity<byte[]> response = restTemplate.exchange(url, HttpMethod.GET, entity, byte[].class, "1");
        
        // 戻り値よりチェック
        if(response.getStatusCode().equals(HttpStatus.OK)) {
            FileOutputStream output = new FileOutputStream(new File("filename.jpg"));
            IOUtils.write(response.getBody(), output);
        }
    }
}

所感

パッケージだけの場合はどのクラスかわかりにくいので動かすのがちょっと手間取ります。まあ、サンプルとして参考にさせていただいているのでわがままはいえませんけどw