たなかのJava日記

どんなことをやったか(学んだか)、どこで詰まったか(わからなかったか)、どこで工夫したかの記録です。

【Spring Boot】@GetMapping、@RequestParamについて

前回はモデルの作成まで完了したので続きになります。

まず行うのは、「ブラウザからHTTPリクエストとして投げられたタスクを追加するエンドポイントの作成」です。


手順を簡単にまとめると、以下になります。
1,Webブラウザ(クライアント)が「HTTPリクエスト」を投げる
2,サーバ側でリクエストを解析・処理してタスク情報を受け取る
3,受け取った情報をエンドポイント(窓口)であるメソッドで処理をしてタスクを追加する


最初に行うことは手順2の、タスク情報を受け取ることです。言い換えるとタスク情報を読み取りたいということです。
そのための(GETリクエスト)アノテーションである、@GetMappingをメソッドの前に記載します。
どこで受け取るかをアノテーションの()内にvalue属性として記載します。
value属性はURLのどのパスに対するリクエストがこのメソッドで処理されるのかを指定するために使われます。


@GetMapping("/restadd")


これで、2番の手順であるwebページでID,タスク名,期限,完了か否かの4つが/restaddに対して送信されてきてタスク情報を取得することできました。
また、@GetMappingを記載することでHTTP通信に関する部分の実装をSpringWebに任せることができます。
その他、補足情報として@GetMappingは@RequestMappingのGETリクエスト用のアノテーションになります。


例えば、今回の@GetMapping("/restadd")は
@RequestMaping("/restadd", method=RequestMethod.GET)と記述したのと同じになります。
@GetMappingとすることで、記述の省略と可読性の向上が期待できます。


次に取得したタスク情報を処理するためのエンドポイントの作成です。
エンドポイントとは簡単に言うと、「Webブラウザ(クライアント)との窓口となるメソッド」のことです。
Webアプリケーションのエンドポイントと呼んだりします。
addItemというメソッドをエンドポイントとして、手順3のタスクを追加する処理を書くことになります。


    @GetMapping("/restadd")
    String addItem(@RequestParam("task") String task,
                   @RequestParam("deadline") String deadline) {
        String id = UUID.randomUUID().toString().substring(0, 8);
        TaskItem item = new TaskItem(id, task, deadline, false);
        taskItems.add(item);

        return "タスクを追加しました。";
    }


処理の説明に入ります。まず、メソッド内のアノテーションについてです。
@RequestParamとは、このアノテーションが付けられた引数は、自動的にHTTPリクエストのパラメータ名に対応します。
パラメータとは、わかりやすくいえば「URLやフォームから送信された値」のことです。
このアノテーションを指定することで、URLやフォームから送られた値が、この引数に設定されるようになるということです。
例えば、ブラウザから「/restadd?task=cooking」と送信されたら、ブラウザからのtaskが(@RequestParam("task")と対応し、引数のtaskにcookingが設定されることになります。


今回、タスクには4つの値が必要ですが、引数は2つ(タスク名と期限)しかありません。
TaskItemのコンストラクタには、ID,タスク名,期限,完了か否かの4つの引数が必要です。
IDは重複が無い値にしたいので、java.util.UUIDクラスのrandomUUIDメソッドを使って生成しています。
ランダムに一意の値を生成する場合に使う常套手段です。
UUIDで生成される文字列は32文字ですが、今回はURLに埋め込まれる値が長いという都合上、先頭の8文字だけを切り出して使っています(本当はダメです)
完了か否かは初期状態では、未完了なので必ずfalseを返すのでメソッド内で指定します。
受け取った2つの引数と、メソッド内で作成したIDとfalseを使って新しくTaskItemオブジェクトを生成し、taskItemフィールドに追加します。


ここまで来たら、プロジェクトを実行します。ブラウザからタスクを追加してみましょう。
ブラウザからアクセスするためのWebページは未作成ですが、GETメソッドを使ったHTTPリクエストであればURLだけでも送ることができます。
ブラウザのアドレスバーに次のようなURLを入力したリクエストを送信してみます。


http://localhost:8888/restadd?task=部屋の掃除&deadline=2022-05-07
※8888は自分で指定したポート番号を記載する


リクエストを送信し、タスクを追加しました。と表示されれば、リクエストは成功です。