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


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

前提

まず@getMappingでStringを返すというやり方は
@sugasaki さんのKotlin + Spring Boot でHello! World!がシンプルでわかりやすくてよかったです。多謝🙏
Spring Initializrの様子が変わっていたので注意が必要ですね)

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

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っぽくしてみました。

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

エスケープがちょっとしんどい形をしていたので調べてみましたが
"""で囲うことでも同じことができるみたいです。
【Kotlin入門】ダブルクォーテーションの中にダブルクォーテーションを表現する方法

GetJsonController.kt
@GetMapping("/get")
    fun getJson(): String {
        return """{"id": 1, "name": "test"}"""
    }

▼▼▼ それっぽく表示されています🎉🎉🎉

returnで作ったJSONを返したい気持ち

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

build.gradle.kts
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")

あ、バッチリ入ってますね!早速使いたいと思います。
(初めて聞いた時は、ジェイソンなの?ジャクソンなの??人名???ってなりましたよね〜...)

👾👾👾

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

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のコンストラクタについて現役エンジニアが解説【初心者向け】

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

GetJsonController.kt
@RestController
class GetJsonController {
    @GetMapping("/get")
    fun getJson(): Data { // 返り値の型をDataにして
        val data = Data(
                id  = 1,
                title = "create JSON!"
        ) // Data()を使って値を入れて
        return data // dataを返します
    }
}

▼▼▼ できました〜🎉🎉🎉

ここまでspring+kotlinでJSONのリクエストとレスポンスをやってみた
How to build a Simple REST API with Kotlin and Spring Bootを参考にしました🙏🙏

リクエスト時のパラメータを使って作ったJSONを返したい気持ち

できるんじゃないかな?と思ったのでやってみます。

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

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🎉🎉🎉