20200221のJavaに関する記事は7件です。

APIのレスポンスを詰めていく(java)

はじめに

最近、APIのテストでコピペして結果を張り付けて〇を付けるみたいなのが面倒だったのでちょろっと作りました...

今回はtxtファイルにURLを記述しておいて、ひたすら呼び出してリストに詰めてファイルへ書き出すみたいな感じでやってます。
動けばいいやって感じなので無駄なことは多いと思いますが目を瞑ってください:frowning2:

C直下にapitestフォルダを作って、その中にtxtファイル入れて実行すれば実行結果が得られるはず...

txtファイル

apiTest.txt
//兵庫県の郵便番号呼び出すやつ
https://zip-cloud.appspot.com/api/search?zipcode=6580083
https://zip-cloud.appspot.com/api/search?zipcode=6580026
https://zip-cloud.appspot.com/api/search?zipcode=6580025
https://zip-cloud.appspot.com/api/search?zipcode=6580082
https://zip-cloud.appspot.com/api/search?zipcode=6580024

ソースコード

ApiTest.java
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class ApiTest {
    public static void main(String[] args) throws InterruptedException {
            //API実行URLが入っているフォルダまでのパス
            final String filePath = "C:\\apitest\\";

            //apiURL 既に準備してるファイル
            List<String> apiUrl = new ArrayList<>();

            //APIの結果を格納する。
            List<String> apiResult = new ArrayList<>();


            //ローカル用のファイルパス
            File file = new File(filePath);

            try {
                if (file.isDirectory()) {
                    String[] fileList = file.list();
                    //ファイル名をstrに今後色々出来るようにとりあえずフォルダ内のファイルをすべて読み込み
                    for(String str:fileList) {
                        try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath + str)))) {
                            //1行の文字列を入れたもの -> line
                            String line;
                            while ((line = reader.readLine()) != null) {
                                apiUrl.add(line);
                            }
                        }
                    }
                }
            }catch(Exception e) {
                e.printStackTrace();
            }
            for(int i=0;i < apiUrl.size();i++) {
                if(apiUrl.get(i) == null) {
                //実行URLが無いとき
                    apiResult.add("");
                }else {
                    apiResult.add(callGet(apiUrl.get(i)));
                }
            }
            //結果をテキストファイルに書き出し
            try(FileWriter fileWrite = new FileWriter("C:\\apitest\\apiResult.txt");
                    PrintWriter pw = new PrintWriter(new BufferedWriter(fileWrite));) {
                    //ファイルへ書き出し
                for(int i=0 ;i<apiResult.size();i++) {
                    pw.println(apiResult.get(i));
                }
            }catch(Exception e) {
                e.printStackTrace();
            }
        }



        public static String callGet(String strGetUrl){

            HttpURLConnection con = null;
            StringBuffer result = new StringBuffer();

            try {

                URL url = new URL(strGetUrl);

                con = (HttpURLConnection) url.openConnection();
                //Basic認証あるパターン
                //con.setRequestProperty("Authorization", "Basic " + Base64.getEncoder().encodeToString("userName:pass".getBytes()));

                con.setRequestMethod("GET");
                con.connect();

                // HTTPレスポンスコード
                final int status = con.getResponseCode();
                if (status == HttpURLConnection.HTTP_OK) {
                    // 通信に成功した
                    // テキストを取得する
                    final InputStream in = con.getInputStream();
                    String encoding = con.getContentEncoding();
                    if(null == encoding){
                        encoding = "UTF-8";
                    }
                    final InputStreamReader inReader = new InputStreamReader(in, encoding);
                    final BufferedReader bufReader = new BufferedReader(inReader);
                    String line = null;
                    // 1行ずつテキストを読み込む
                    while((line = bufReader.readLine()) != null) {
                        result.append(line);
                    }
                    bufReader.close();
                    inReader.close();
                    in.close();
                }else{
                    System.out.println(status);
                }

            }catch (Exception e1) {
                e1.printStackTrace();
            } finally {
                if (con != null) {
                    // コネクションを切断
                    con.disconnect();
                }
            }
            System.out.println("result=" + result.toString());

            return result.toString();
        }

    }

最後に

場合によってはBasic認証あるときもあるのでそのパターンも記述しておきました
401のエラーが返ってきたら大体Basic認証いるんで、そのときはBasic認証部分を書けば何とかなる気がします

以上です:relaxed:

参考

http://www.programing-style.com/android/android-api/android-httpurlconnection-get-text/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Eclipseのインストール~Java(PHP)の実行まで

 この記事でできること

ダウンロード

URL:https://mergedoc.osdn.jp/
▼特にこだわりもないので最新版を選択
image.png

▼Python,XAMPPは既に入っているので今回はJava(FullEdition)を選択。1,5GBあるので気長に待つ。
image.png

解凍~起動

▼ダウンロード完了後解凍。こんな感じになっているはず。[eclipse.exe]を実行
image.png

▼起動画面が出てくる。初回はキャッシュクリアのため1分ほど待つ
image.png

▼ワークスペース(実際のソースとかを置くところ)を選択する
image.png

▼ワークスペースの選択後IDEの画面が表示される
image.png

▼ワークスペースには[.metadata]フォルダだけがある状態
image.png

Javaアプリの実行まで

▼Javaプロジェクトの作成を選択
image.png

▼プロジェクト名を入力し「次へ」(完了でもいいがせっかくなので覗いてみる)
image.png

▼ビルド設定。今回は特に触らずに「完了」
image.png

▼「module-info.javaの作成」なんのこっちゃ、、、。Java9の新機能らしい。とりあえず「作成」
image.png

▼Javaプロジェクトが完成
image.png

▼ソースを書くファイルを作成。画面左の「パッケージエクスプローラー」で右クリック→「新規」→「ファイル」
image.png

▼ファイル名を入力し「完了」
image.png

実際にコードを書く。
どうも「module-info.javaの作成」をしたばっかりにpackage宣言しないといけないようなので[hallowWorld]パッケージの宣言をする。実ファイルのディレクトリもIDEが自動で変更する。

hellowWorld.java
package hellowWorld;
class hellowWorld{
  public static void main(String[] args){
    System.out.println("HelloWorld");
  }
}

▼コードを保存して実行。ソースファイルがアクティブな状態であれば画面上部の「実行」マークから実行できる
image.png

▼実行結果がコンソールに出力されて終了
image.png

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java Listの入れ子をひとまとめにする

Java8以降であれば、flatMapを使えばいけそうです。

Map<UserId, List<User>> userMap;
List<User> users = userMap.entrySet()
  .stream()
  .map(Map.Entry::getValue) // List<User>を抜き出す
  .flatMap(Collection::stream) // List<User> -> Stream<User>に変換
  .collect(Collectors.toList());

map()はCollectioinの要素を取り出して変換を行うメソッドで、
flatMap()はCollectionの要素を取り出してStreamへの変換を行うメソッドです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

JAVAの依存性に対する簡単な説明

今回はJavaの依存性に対して扱って見ました。

Javaにおいて依存性とは何?

「依存性がある」というのは簡単に言うと、「他のクラスを利用している」ということです。具体的には、以下の2つのどちらかに該当すると、依存性があると言えるでしょう。

  • 他のクラスをローカル変数として持つ
  • 他のクラスがメソッドの引数、戻り値になっている

例えば、弁当を例で説明してみましょう。弁当にご飯があります。他にもおかずなどいろいろありますが、例を簡単にするためにご飯だけを例にしてみましょう。そのとき、コードは以下のようになるでしょう。

  • 弁当クラス
//弁当クラス
public class Bento {
 private Gohan gohan;//ご飯

 //コンストラクタ
 public class Bento(Gohan gohan) {
  this.gohan = gohan;
 }
}

この弁当クラスは、ご飯を入れます。この弁当を作る(new)にはコードは以下のようになります。

  • Mainクラス
public class Main {
 public static void main(String[] args) {

  //ご飯の生成(インスタンス化)
  Gohan gohan = new Gohan();

  //弁当の生成(インスタンス化)
  Bento bento = new Bento(Gohan);
 }
}

このように、あるクラスが別のクラスを利用するのこと依存と言います。

引用 : Dripcoke

IT用語辞書-依存性

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

クラス型のArrayListから、要素を順に取り出す

はじめに

JAVAにおいて、
「クラス型の要素を格納したArrayListから、それぞれの要素のフィールドのデータを順に取り出す」
という処理を、メソッドとして定義する方法がわからなかった。
解決方法を備忘録として書き記しておく。

問題となったこと・その解決の鍵になったこと

  • メソッドの仮引数にArrayListを指定する方法が分からない

 -> ArrayList<型> 変数名 とする。

  • for文の中で、クラスのフィールドを呼び出す方法が分からない

 -> リストの変数名.get(i).getName() などとする。

環境

OpenJDK 13 (dokojavaの利用)

具体例

自販機のシステムを模したソースコードで、
- Main.java(Mainメソッドと今回問題となったメソッドを含むクラス)
- Drink.java(飲み物を示すクラス)

の2ファイルで構成される。

Main.java
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {

        var drinklist = new ArrayList<Drink>();

        // Drinkクラスを格納するArrayListに飲み物を追加
        Drink coffee = new Drink("コーヒー", 1, 130);
        drinklist.add(coffee);

        Drink water = new Drink("水", 2, 100);
        drinklist.add(water);


        // 今回問題となったメソッドの呼び出し
        displayProduct(drinklist);

        }

        // メソッドを定義
        // ArrayListからDrinkクラスのフィールドを順に取り出す
    public static void displayProduct(ArrayList<Drink> drinklist) {
        for(Drink drink : drinklist) {
        System.out.println(drink.getNumber() + "." + drink.getName()
            + drink.getPrice() + "円");
        }
    }
}
Drink.java
public class Drink {
    private String name;
    private int number;
    private int price;

    public String getName() {
    return this.name;
    }
    public int getNumber() {
        return this.number;
    }
    public int getPrice() {
        return this.price;
    }

    public Drink(String name, int number, int price){
        this.name = name;
        this.number = number;
        this.price = price;
    }
}

出力結果

1.コーヒー130円
2.水100円
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Spring Boot で開発環境の組み込みDB(h2)とリリース用データベース(SQL Server)でFlaywayを共存させる

前提

  • Spring Boot でデータベースを使うサーバアプリケーションを作る
  • hibernate を使っていて、データベースも初期化している。
    • spring.jpa.hibernate.ddl-auto=update
  • ローカルの開発環境は h2 を使った組み込み DB をオンメモリで起動
    • アプリを起動する度にデータベースを初期化する
  • リリース先ではもちろん永続化が必要なので別のデータベースに切り替える
    • 今回は SQL Server
  • データベースのスキーマ変更が必要になったので Flyway で構成管理したい

問題点

  • Flyway を適用して db/migration に SQL ファイルを置くが、2 種類のデータベースで競合する。
  • ローカルでの開発時は h2 を使うのでマイグレーションは不要
    • 毎回作り直しでオッケー
  • SQL Server を使う場合はマイグレーションして欲しい

解決方法

  • SQL ファイルを vendor 毎に分けて配置
  • h2 の場合はダミーの SQL ファイルを配置
  • FlyWay の SQL が先に実行されるので hibernate の初期化は影響を受けない(テーブルが作成済みのため)
application.properties
spring.flyway.locations=classpath:db/migration/{vendor}
src/main/resources/
  db/
    migration/
      H2/
        V1_0_0__dummy.sql
      SQLSERVER/
        V1_0_0__Initial.sql
        V1_1_0__AddHoge.sql
V1_0_0__dummy.sql
select 'dummy';
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Spring Boot で開発環境の組み込みDB(h2)とリリース用データベース(SQL Server)でFlywayを共存させる

前提

  • Spring Boot でデータベースを使うサーバアプリケーションを作る
  • hibernate を使っていて、データベースも初期化している。
    • spring.jpa.hibernate.ddl-auto=update
  • ローカルの開発環境は h2 を使った組み込み DB をオンメモリで起動
    • アプリを起動する度にデータベースを初期化する
  • リリース先ではもちろん永続化が必要なので別のデータベースに切り替える
    • 今回は SQL Server
  • データベースのスキーマ変更が必要になったので Flyway で構成管理したい

問題点

  • Flyway を適用して db/migration に SQL ファイルを置くが、2 種類のデータベースで競合する。
  • ローカルでの開発時は h2 を使うのでマイグレーションは不要
    • 毎回作り直しでオッケー
  • SQL Server を使う場合はマイグレーションして欲しい

解決方法

  • SQL ファイルを vendor 毎に分けて配置
  • h2 の場合はダミーの SQL ファイルを配置
  • Flyway の SQL が先に実行されるので hibernate の初期化は影響を受けない(テーブルが作成済みのため)
application.properties
spring.flyway.locations=classpath:db/migration/{vendor}
src/main/resources/
  db/
    migration/
      H2/
        V1_0_0__dummy.sql
      SQLSERVER/
        V1_0_0__Initial.sql
        V1_1_0__AddHoge.sql
V1_0_0__dummy.sql
select 'dummy';
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む