- 投稿日:2020-02-21T21:16:15+09:00
APIのレスポンスを詰めていく(java)
はじめに
最近、APIのテストでコピペして結果を張り付けて〇を付けるみたいなのが面倒だったのでちょろっと作りました...
今回はtxtファイルにURLを記述しておいて、ひたすら呼び出してリストに詰めてファイルへ書き出すみたいな感じでやってます。
動けばいいやって感じなので無駄なことは多いと思いますが目を瞑ってください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.javaimport 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認証部分を書けば何とかなる気がします以上です
参考
http://www.programing-style.com/android/android-api/android-httpurlconnection-get-text/
- 投稿日:2020-02-21T19:52:56+09:00
Eclipseのインストール~Java(PHP)の実行まで
この記事でできること
- Eclipseをインストールし、Javaが実行できる
- PHPを実行できる(XAMPPがインストール済みの場合)…長くなったので別記事:EclipseでPHPを開発できるようにする - Qiita
ダウンロード
URL:https://mergedoc.osdn.jp/
▼特にこだわりもないので最新版を選択
▼Python,XAMPPは既に入っているので今回はJava(FullEdition)を選択。1,5GBあるので気長に待つ。
解凍~起動
▼ダウンロード完了後解凍。こんな感じになっているはず。[eclipse.exe]を実行
▼起動画面が出てくる。初回はキャッシュクリアのため1分ほど待つ
▼ワークスペースには[.metadata]フォルダだけがある状態
Javaアプリの実行まで
▼プロジェクト名を入力し「次へ」(完了でもいいがせっかくなので覗いてみる)
▼「module-info.javaの作成」なんのこっちゃ、、、。Java9の新機能らしい。とりあえず「作成」
▼ソースを書くファイルを作成。画面左の「パッケージエクスプローラー」で右クリック→「新規」→「ファイル」
実際にコードを書く。
どうも「module-info.javaの作成」をしたばっかりにpackage宣言しないといけないようなので[hallowWorld]パッケージの宣言をする。実ファイルのディレクトリもIDEが自動で変更する。hellowWorld.javapackage hellowWorld; class hellowWorld{ public static void main(String[] args){ System.out.println("HelloWorld"); } }▼コードを保存して実行。ソースファイルがアクティブな状態であれば画面上部の「実行」マークから実行できる
以上
- 投稿日:2020-02-21T16:43:09+09:00
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への変換を行うメソッドです。
- 投稿日:2020-02-21T13:00:36+09:00
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
- 投稿日:2020-02-21T12:01:42+09:00
クラス型のArrayListから、要素を順に取り出す
はじめに
JAVAにおいて、
「クラス型の要素を格納したArrayListから、それぞれの要素のフィールドのデータを順に取り出す」
という処理を、メソッドとして定義する方法がわからなかった。
解決方法を備忘録として書き記しておく。問題となったこと・その解決の鍵になったこと
- メソッドの仮引数にArrayListを指定する方法が分からない
->
ArrayList<型> 変数名
とする。
- for文の中で、クラスのフィールドを呼び出す方法が分からない
->
リストの変数名.get(i).getName()
などとする。環境
OpenJDK 13 (dokojavaの利用)
具体例
自販機のシステムを模したソースコードで、
- Main.java(Mainメソッドと今回問題となったメソッドを含むクラス)
- Drink.java(飲み物を示すクラス)の2ファイルで構成される。
Main.javaimport 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.javapublic 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円
- 投稿日:2020-02-21T11:56:01+09:00
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.propertiesspring.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.sqlV1_0_0__dummy.sqlselect 'dummy';
- 投稿日:2020-02-21T11:56:01+09:00
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.propertiesspring.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.sqlV1_0_0__dummy.sqlselect 'dummy';