Closed10

1bitもわからんけどKotlin (Ktor)してみる

inomotoinomoto

kotlinを触ってみようと思うが

  • kotlinを始め、最近のJVM系言語はろくに触ったことがない
  • java7くらいの頃にJerseyとかTomcatとかは触ったことある、程度。ant, mavenあたりは知ってる

web系の人なのでフレームワークとしてKtorをチョイス。

inomotoinomoto

手元にjava環境など無い。vscodeのRemoteContainerにて適当にjava環境を作る。

java11と15が選べたが、defaultになっている11をチョイス。LTSだしな。
devcontainer.jsonはshell指定の削除だけ実施してそのまま使う。

inomotoinomoto

何をしたらいいのか全くわからないのだが、生成されたプロジェクトのファイルに一つだけ実行可能ファイルがある。 gradlew

生成されたコンテナ内でおもむろにそれを実行すると、Gradleが動き出したようなログが出る。
shellは戻ってきたが、なにやらdaemon化されたサーバプロセスが生成されたもよう。ポートが開いている。

vscodeがport forwardしてくれたのでブラウザで開く...が、ERR_EMPTY_RESPONSEとのこと。流石に1文字もコード書いてないのでそんなもんか?

inomotoinomoto

src/Application.ktがメインというかエントリポイントのあるファイルのようだが...nettyのデフォルトのエントリポイント?が指定されているっぽいことはわかる。

Application.kt
package com.example

import io.ktor.application.*
import io.ktor.response.*
import io.ktor.request.*

fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)

@Suppress("unused") // Referenced in application.conf
@kotlin.jvm.JvmOverloads
fun Application.module(testing: Boolean = false) {
}

...ひとまず公式チュートリアルっぽいものを見る; https://play.kotlinlang.org/hands-on/Creating HTTP APIs with Ktor/01_introduction

inomotoinomoto

どうもさっき使ったプロジェクトジェネレータから始める想定のものではないっぽい。
このチュートリアルが前提?にしている初期環境のリポジトリを見ながらそれっぽくなんとかしてみる; https://github.com/kotlin-hands-on/creating-http-api-ktor

まずデフォルトで生成されているApplication.ktが既にjavaのディレクトリ構成(パッケージ構成のやつ)に沿っていないのだが。動いてるけど。javaのこのあたりはちょっとよくわからない。
上記リポジトリにそってそれっぽく置く。

inomotoinomoto

チュートリアルっぽいものに沿い、モデル・ルーティングまで置き、ContentNegotiationを置いたところでunresolvedな感じになった。

このへんによるとContentNegotiationio.ktor.featuresにあるらしいのでimportを増やす。
更にこのへんによるとjsonio.ktor.serializationにあるらしいのでimportを増やす。

これ、どうも始め方と参照するものを間違えている気配がある。明らかに入門者へのハンズオンって感じの情報量じゃない。

inomotoinomoto

プロジェクトを初期の状態に戻し、下記ブログを参考にして
https://tech.uzabase.com/entry/2020/03/17/090000

Application.kt
fun Application.module(testing: Boolean = false) {
  routing { get("/") { call.respondText("Hello, world!") } }
}

な感じにしたら一応hello worldはできた。求めていたのは完全にこれだった。

inomotoinomoto

流石に1bitも知らないところから続けるにはかなり厳しいので出直す。

ここで得られた教訓としては

  • java系プロジェクトは前提が非常に複雑なので、遠回りでもシンプルに始めるように頑張ったほうがいい(テンプレ生成に頼らない)
  • 公式がそんな使いやすくない(RailsやVueなど公式が凄まじくに丁寧なやつと比べて)

java servletやgradleとかについてミニマルにちゃんと調べてこよう。

このスクラップは2021/01/10にクローズされました