Java+SpringBootでWebAPI作るよ

# なにこれ？
IntelliJでJava+SpringBootを使ってWebAPIを作るよ。
リクエストボディにJSONで値を渡して、API側で受け取るところまで作るよ。
# 環境構築
## 前提環境
Windows11 64bitだよ。
## Java開発に必要なJDKをインストールするよ。
1. https://jdk.java.net/21/
から、Windows向けのzipファイルをダウンロードするよ。
SpringBootだったかIntelliJだったかが最新のバージョン22に対応していなかった気がするから21にするよ。
1. ダウンロード出来たら、適当に解凍して適当なフォルダに配置するよ。
多分パスに日本語が入らないパスがいいよ。
とりあえず`C:¥Java¥jdk-21.0.2`に配置したよ。
1. パスを通す
Windowsの環境変数に以下の通り設定するよ。

||名称|値|
|--|--|--|
|新規|JAVA_HOME|C:¥Java¥jdk-21.0.2|
|追加|PATH|%JAVA_HOME%\bin|

これでコマンドプロンプトで以下のようにJavaが動く状態になるよ。
```powershell:コマンドプロンプト
> java --version
openjdk version "21.0.2" 2024-01-16
OpenJDK Runtime Environment (build 21.0.2+13-58)
OpenJDK 64-Bit Server VM (build 21.0.2+13-58, mixed mode, sharing)
```

## IntelliJをインストールするよ。
1. https://www.jetbrains.com/ja-jp/idea/download/?section=windows
からインストーラをダウンロードするよ。
無料のCommunity版はページの下の方にあるよ。ちょっとわかりにくいね。でも無料だから仕方ないね。
今回は環境をあんまり汚したくなかったからzip版を入れてみたよ。
1. ダウンロードできたら適当に解凍して、`bin\idea64.exe`を実行するとIntelliJが起動したよ。
簡単だね。

# プロジェクトひな形を用意するよ
1. https://start.spring.io/
でSpringBootプロジェクトのひな型を作ってくれるよ。助かるね。
初期設定から以下の部分だけ変えて、GENERATEボタンでzipファイルをダウンロードするよ。
ダウンロードしたら適当なパスに解凍するよ。これも多分日本語が入らないパスがいいと思うよ。
  * Java：　初期設定が17だったけど、21に変更したよ。
  * Dependencies：　`Spring Web`と`Lombok`を追加したよ。

IntelliJを起動して、Openボタンで上記回答したフォルダを選択して開くよ。
これで開発が開始できるね。

# 開発スタート
## とりあえずSpringInitialzrで作ったデモを起動してみるよ
1. 左上のハンバーガーアイコン（以下メインメニューとする）から、`Build` -> `Build Project`を実行すると、ビルドできるよ。
この時点でつまずいたら、多分プロキシ設定の問題だよ。`メインメニュー` -> `Appearance & behavior` -> `System Settting` -> `HTTP Proxy` あたりの設定を何とかすればイケるんじゃないかな。
1. 左ペインのファイルツリーから、`demo` -> `src` -> `main` -> `java` -> `com.example.demo` -> `DempApplication`をクリックして右ペインにコードを表示しよう。
1. `メインメニュー` -> `Run` -> `Debug 'DempApplication.java'`を実行すると、デバッグ起動するよ。
適当なブラウザで`http://localhost:8080/`でアクセスしてなんかエラーページが表示されたら成功だよ。失敗してたらサイトにアクセスできないって言われるからね。
## 単純なAPIを作ってみるよ。
ネームスペース分けるのも面倒だから`DempApplication`と同じフォルダに新規コントローラクラス作るよ。
名前は適当に`Otacon`にしたよ。お試しコントローラの略だよ。
```Java:Otacon.java
package com.example.demo;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/OtaAPI")
public class Otacon {
    @GetMapping("/simpleHoge")
    public ResponseEntity<String> simpleApi() {
        return ResponseEntity.ok("hogehoge");
    }
}
```
このクラスを作ったら、また`DempApplication`を右ペインに表示してデバッグ実行するよ。
下ペインのTerminalに以下のコマンドを打ち込むと、`hogehoge`という文字列を得られるよ。
```powershell:コマンドプロンプト
> curl http://localhost:8080/OtaAPI/simpleHoge
hogehoge
```

## JSONを受け取るよ
`Otacon.java`を改造するよ。`json1`メソッドと`Input`クラスを追加したよ。
`Input`クラスは別に内部クラスで作る必要はないと思うよ。面倒だからここに作っただけなんだ。
```Java:Otacon.java バージョン2
package com.example.demo;

import lombok.Data;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/OtaAPI")
public class Otacon {
    @GetMapping("/simpleHoge")
    public ResponseEntity<String> simpleApi() {
        return ResponseEntity.ok("hogehoge");
    }

    @PostMapping("/json1api")
    public ResponseEntity<String> json1(@RequestBody Input input) {
        return ResponseEntity.ok(input.key2+"/"+input.key1);
    }

    @Data
    public static class Input {
        private String key1;
        private String key2;
    }
}
```

これでコマンドプロンプトで以下のようにJavaが動く状態になるよ。
```powershell:コマンドプロンプト
> curl http://localhost:8080/OtaAPI/json1api -X POST -d "{\"key1\":\"キー1\",\"key2\":\"キー2\"}" -H "Content-Type: application/json" 
キー2/キー1
```
余談だけど、コマンドプロンプトでのJSON送付が独特でだいぶ詰まったよ。
以下の記事を参考にさせてもらったよ。ありがとう！

https://qiita.com/tocoteron/items/291b463e45f422abd425

以上でリクエストボディに設定した値をAPI側で参照できるようになったね！
おわるよ。