初心者が Kotlin + Spring BootのGetリクエストでJSONを返すためにしたこと

業務でサーバーサイドをやることになったのでその練習のためにやったことをまとめました。
サーバーの経験は一瞬くらいしかありません🥺🥺🥺（Javaの入門書をこなしたくらい...）

## 前提
まず`@getMapping`でStringを返すというやり方は
@sugasaki さんの[Kotlin + Spring Boot でHello! World!](https://qiita.com/sugasaki/items/d42d017961a97f5363ee)がシンプルでわかりやすくてよかったです。多謝🙏
（[Spring Initializr](https://start.spring.io/)の様子が変わっていたので注意が必要ですね）

▼▼▼ 参考に考えてみたコード

```kotlin:GetJsonController.kt
package com.example.demo

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController

@RestController
class GetJsonController {
    @GetMapping("/get")
    fun getJson(): String {
        return "私はここでJSONを返したい"
    }
}
```

## returnでJSONを返したい気持ち
単に`return`の中の文字列をJSONっぽくしてみました。

```kotlin:GetJsonController.kt
@GetMapping("/get")
    fun getJson(): String {
        return "{\"id\": 1, \"name\": \"test\"}" // エスケープしんどいですね！
    }
```

エスケープがちょっとしんどい形をしていたので調べてみましたが
`"""`で囲うことでも同じことができるみたいです。
→[【Kotlin入門】ダブルクォーテーションの中にダブルクォーテーションを表現する方法](https://itneko.com/kotlin-triple/)

```kotlin:GetJsonController.kt
@GetMapping("/get")
    fun getJson(): String {
        return """{"id": 1, "name": "test"}"""
    }
```
▼▼▼ それっぽく表示されています🎉🎉🎉
<img width="625" alt="スクリーンショット 2020-07-15 15.34.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349231/df850439-a6de-54c6-6858-7852b541c9d6.png">

## returnで作ったJSONを返したい気持ち
いちいち手打ちするのはつらいので、JSONを作って投げたいと思います。
（昔、JSONファイルを何とかしたい時、Jacksonを使ったような...）と思い出したので
`build.gradle`をチェックしてみます。

```kotlin:build.gradle.kts
	implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
```
あ、バッチリ入ってますね！早速使いたいと思います。
（初めて聞いた時は、ジェイソンなの？ジャクソンなの？？人名？？？ってなりましたよね〜...）

👾👾👾

まず`@JsonCreator`するためのクラスを作りました。

```kotlin:Data.kt
package com.example.demo

import com.fasterxml.jackson.annotation.JsonCreator

data class Data @JsonCreator constructor (
        val id: Int,
        val title: String
)
```

書いていて「え？data class ~~ constructor()って何？」ってなった自分のために
→ [Kotlinのdata classのコンストラクタについて現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/32490)

ControllerでこのDataクラスを使うように書き換えます。

```kotlin:GetJsonController.kt
@RestController
class GetJsonController {
    @GetMapping("/get")
    fun getJson(): Data { // 返り値の型をDataにして
        val data = Data(
                id  = 1,
                title = "create JSON!"
        ) // Data()を使って値を入れて
        return data // dataを返します
    }
}
```
▼▼▼ できました〜🎉🎉🎉
<img width="627" alt="スクリーンショット 2020-07-15 16.04.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349231/7e788716-e3c2-2a8f-4ba8-9277cc1b3261.png">

ここまで[spring+kotlinでJSONのリクエストとレスポンスをやってみた](https://mitubaex.hatenablog.com/entry/2017/10/19/043518)と
[How to build a Simple REST API with Kotlin and Spring Boot](https://scotch.io/@grahamcox82/how-to-build-a-simple-rest-api-with-kotlin-and-spring-boot)を参考にしました🙏🙏

## リクエスト時のパラメータを使って作ったJSONを返したい気持ち
できるんじゃないかな？と思ったのでやってみます。

`@RequestMapping`と`@RequestParam`を追加してみます。

```kotlin:GetJsonController.kt
@RestController
@RequestMapping
class GetJsonController {
    @GetMapping("/get")
    fun getJson(@RequestParam(value = "title", required = false, defaultValue = "Test title") title: String,
                @RequestParam(value = "id", required = false, defaultValue = "1") id: String): Data {
        val data = Data(
                id = "$id".toInt(),
                title = "$title"
        )
        return data
    }
}
```

これで、パラメーターに`?title='hogehoge'&id=4`などと入れると反映されるようになりました。

▼▼▼ `?title='wow'&id=3`をつけてみた時の結果です wow🎉🎉🎉
<img width="626" alt="スクリーンショット 2020-07-15 16.19.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349231/9651060b-0c9d-950d-65b2-adf2119211a8.png">