LoginSignup
0
0

More than 1 year has passed since last update.

【Java】HttpClientでAPIを叩いてみる②

Posted at

前回の記事

やること

Dog APIを試してみる。
リクエストを送ると写真を表示するurlを返してくれる。

こんな感じ

{
    "message": "https://images.dog.ceo/breeds/pointer-germanlonghair/hans1.jpg",
    "status": "success"
}

環境

System Version
OS MacOS Monterey(12.1)
Intelli J 2022/2/2
sdk Temurin 11.0.14

APIを叩く

jdk11で進めていきます。

Dog.java
package API;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import org.json.JSONObject;

public class Dog {
    public static void main(String[] args) {
        String url = "https://dog.ceo/api/breeds/image/random";
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest req = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .GET()
                .build();
        String dogURL = "";
        try {
            HttpResponse<String> res = client.send(req, HttpResponse.BodyHandlers.ofString());
            JSONObject jsonObject = new JSONObject(res.body());
            dogURL = (String)jsonObject.get("message");
            System.out.println(dogURL);
        } catch (IOException | InterruptedException ex) {
            ex.printStackTrace();
        }
    }
}

実行結果
https://images.dog.ceo/breeds/stbernard/n02109525_9522.jpg

アクセスしてみると

スクリーンショット 2023-03-02 14.24.26.png

自動で表示するようにする

urlだけ出されてもパッとしないので、Desktopライブラリを使って開くとこまでやる。

Dog.java
try {
    if (Desktop.isDesktopSupported()) {
        Desktop desktop = Desktop.getDesktop();
        desktop.browse(new URI(dogURL));
    }
} catch (IOException | URISyntaxException ex) {
    ex.printStackTrace();
}
  • isDesktopSupported()で環境がサポートされているかを確認
  • getDesktop()でインスタンス生成
  • browse()メソッドにdogURLを入れて開いてもらう。

思ったより簡単に使えた。

IOException, URISyntaxExceptionの例外処理は必須です。

isDesktopSupported()

 158:   private static boolean isDesktopSupported()
 159:   {
 160:     if (GraphicsEnvironment.isHeadless())
 161:       return false;
 162:     
 163:     return true;
 164:   }

GraphicsEnvironment.isHeadless()

 122:   public static boolean isHeadless()
 123:   {
 124:     String headless = SystemProperties.getProperty("java.awt.headless", null);
 125:     return "true".equalsIgnoreCase(headless);
 126:   }

SystemProperties.getProperty()

java.awt.headlessの設定を調べて、なければnullを代入。
trueTrueTRUEあたりが来るのでequalsIgnoreCase()で比較した結果を返す。

スクリーンショット 2023-03-02 16.29.01.png

画像引用:https://www.task-notes.com/entry/20151004/1443951543

これがtrueであった場合、ヘッドレスモードで動いていることにになる。

ヘッドレス・モードは、Java アプリケーションがユーザーと直接対話しない場合に使用できます。つまり、ウィンドウやダイアログ・ボックスが表示されず、キーボードやマウスによる入力がなく、Heavyweight AWT コンポーネントを使用しない Java アプリケーションの場合です。

実行時に-Djava.awt.headless=falseとするとそういったウィンドウを立ち上げるようなGUI操作が無効化されるみたい。

isDesktopSupported()はOSとかの低レベル層をチェックしているのではなく、単にGUI環境がサポートされているか確認しているだったのでfalseになることはほとんどなさそう。

画像を保存する

URLConnectionを使って指定したurlのリソースを読み込みます。

Dog.java
try {
    URL url = new URL(dogURL);
    URLConnection conn = url.openConnection();
    InputStream is = conn.getInputStream();

    File file = new File("/Users/syoshika/Downloads/dog.jpg");
    FileOutputStream fos = new FileOutputStream(file);

    int len = 1024;
    byte[] buf = new byte[len];
    while ((len = is.read(buf, 0, len)) != -1) {
        fos.write(buf, 0, len);
    }
    fos.close();
    is.close();
} catch (IOException ex) {
    ex.printStackTrace();
}
  • getInputStream()でリソースを読み込む
  • FileOutputStream()で書き込む準備(dog.jpgにした)
  • bufにreadしてファイルにwriteをひたすら繰り返す。
  • 1024は気分。これぐらいが早い気がした。

実際にread()で読み込んだ文字数分を書き込むようにするため、返り値をlen保存しておく。

戻り値:
バッファに読み込まれたバイトの合計数。
ストリームの終わりに達してデータがない場合は-1。

CaaS

Cat as a serviceって意味らしい、草

せっかくなのでgifでやってみる。

Cat.java
try {
    URL url = new URL("https://cataas.com/cat/gif");
    URLConnection conn = url.openConnection();
    InputStream is = conn.getInputStream();

    File file = new File("/Users/syoshika/Downloads/cat.gif");
    FileOutputStream fos = new FileOutputStream(file);
    int len = 1024;
    byte[] buf = new byte[len];
    while ((len = is.read(buf, 0, len)) != -1) {
        System.out.println(len);
        fos.write(buf, 0, len);
    }
    fos.close();
    is.close();
} catch (IOException ex) {
    ex.printStackTrace();
}

GIFは単に複数の画像を連続的に表示してるだけなので、
犬の時とやることは変わらずInputStream()で読み込めるしFileOutputStream()で対応できる。

cat.gif

飛んでる最中が情けなくて可愛い。

次やること

POSTに触れる

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0