💣

JAVAでAPI通信をしてJSONを取得

2024/04/08に公開

仕事の関係でAPI周りの復習。

以前kotlinでやったことはあったけど今一度確認。

使用環境
:Windows10
:eclipse
:TomCat9.0

eclipse独特のサーブレット設定が少し大変だった。

サーブレット設定にかんしては、以下を参考
https://eng-entrance.com/java-servlet-eclipse

servlet設定の記述の中に非同期処理を書くことで取得が可能に

今回だとこんな感じ

ServletSample.java
@WebServlet(”/ServletSample”)
    public class ServletSample extends HttpServlet {
    private static final long seriaVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{
    //ここまでがサーブレット設定の記述 HelloWorldとか出したいならここに書けば出る
  
}
}

APIの取得の記述に入ります。

今回のカギとなるのはこいつ

import java.net.HttpURLConnection;

こいつの使い方を確認して
APIの取得の流れを今一度復習して以下のようになるのがわかりました。

1 接続URLを決める
2 URLのコネクションを取得する
3 接続設定 (メソッド決定、タイムアウト値、ヘッダー値等)を行う
4 コネクションを開く
5 リクエストボディのみ書き込みを行う(POST)
6 レスポンスの読み出しを行う
7 コネクションを閉じる

順を追ってみていきます。

1接続のURLを決める

string queryStrring = request.getQueryString()//リクエストからクエリ文字列を取得
String urlStrring = "https://pokeapi.co/api/v2/pokemon/ditto?" + queryString + "&format=json";

今回はPokemonAPIに接続
2行目がurl接続先で、
1行目がリクエストからクエリ文字列を取得するメソッドのインスタンス化

2コネクションの取得

URL url = new URL(urlString);
HttpURLConnection con = (HttpURLConnection) url.openConnection();

URL#openConnection はコネクションを開き通信可能状態になりそうな名前ですが、
実際は開いただけで接続されていないため通信はできません。
(3に行く準備のようなもの)

3 接続設定

con.setRequestMethod("GET");
con.setRequestProperty("Accept", "application/json");

    StringBuilder result = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()))) {
            String line;
            while ((line = reader.readLine()) != null) {
                result.append(line);

setRequestMethod を使うことでGETやPOSTなどのHTTPリクエストメソッドを設定できます。
setRequestProperty を使うことでヘッダーに値を設定できます。

4 コネクションを開く

con.disconnect();

5はスキップ

6 レスポンスボディの読み出しを行う

 //応答タイプを JSON に設定
 response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(result.toString()); // APIレスポンスを直接送信する

レスポンスの返り値の型を諸々指定

終わり 完成版のコードはこちら

package sample;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/ServletSample")
public class ServletSample extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String queryString = request.getQueryString(); // リクエストからクエリ文字列を取得
        String urlString = "https://pokeapi.co/api/v2/pokemon/ditto?" + queryString + "&format=json";

        URL url = new URL(urlString);
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("GET");
        con.setRequestProperty("Accept", "application/json");

        StringBuilder result = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()))) {
            String line;
            while ((line = reader.readLine()) != null) {
                result.append(line);
            }
        }
        con.disconnect();

        //応答タイプを JSON に設定
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        response.getWriter().write(result.toString()); // APIレスポンスを直接送信する
    }
}

ホストを立ち上げたときの接続先は

http://localhost:8080/[Project名]/[URLパターン]

これで行ける。

出来た。

まだまだ調べないとできないから反復練習だな。。。

Discussion