この記事について
去る2020/12/22にKtor ver1.5.0がリリースされました。
この記事はJetBrains社のブログに掲載されているリリースノートを翻訳したものです。
https://blog.jetbrains.com/ktor/2020/12/22/ktor-1-5-0-released/
大いに意訳を含んでいるので、元記事をしっかり確認しましょう。
Features
1.5.0は今年の三度目かつ最後のリリースで、年に3回のメジャーリリースまたはマイナーリリース、月に最低1回のパッチリリースを行うという私達の約束に沿ったものです。時折遅れることもありましたが、多かれ少なかれこの約束を守ることができて嬉しく思います。
このマイナーアップデートでは次のような新機能があります。
新しい開発モード
Ktorは開発向けの一連機能、たとえばauto-reloadや拡張でバック情報等を提供しています。これらは開発中に役立ちますが、本番環境では速度低下する可能性があります。1.5.0ではシンプルな構成もしくはフラグで新しい開発モードを有効にできる機能を導入しています。また本番環境の設定を簡単に切り替えることができます。
この機能はapplication.conf
内でdevelopment=true
の記述を利用することでアクティブ化できます。
auto-reloadはこの新しい開発モードでのみ有効になっているため、これは重要な変更です。
Java HTTP Clientのサポート
Java11ではリアクティブストリームに基づくHTTP Clientが導入されています。Ktor ClientはJVMをターゲットにしているとき、このHTTP Clientをサポートするようになりました。
これを使用するには、HTTPClient
のパラメータにJava
という値を渡すだけです。
HttpClient(Java)
もちろん、これを利用するにはJava11が必要です。
HttpRequestBuilderを介したCookieの送信をサポート
HttpRequestBuilderを利用する場合、coolies
という名前の新しいメソッドを利用して簡単にCookieを送信できるようになります。
cookies {
append("my_cookie", value = "My cookie Value")
}
事前圧縮されたファイルのサポート
既に圧縮されているファイルを送信した場合、Ktorがそのコンテンツを更に圧縮しようとしないようにします。preCompressed
機能は簡単に利用できます。
static {
preCompressed {
files(temp.parentFile)
}
}
コミュニテイのコントリビューターであるguicamestの貢献に感謝します
CORSでのカスタムヘッダーのサポート
CORSリクエストでカスタムヘッダーを許可するためのサポートが追加されました。通常、リクエスト内の任意のヘッダーを許可することは推奨されませんが特定のパターンに従うカスタムヘッダーをKtorで指定できます。
application.install(CORS) {
anyHost()
allowHeadersPrefixed("custom-")
}
この貢献をしてくれたJozeに感謝します。
実験的なWebSocketと収縮の拡張機能
WebSocketと収縮の拡張機能のサポートを導入しました。これによりRFC-7692としての実装が提供されます。
この機能を利用するには、インストールしてください
install(WebSockets) {
extensions {
install(WebSocketDeflateExtension) {
// Deflate option
compressionLevel = Deflater.DEFAULT_COMPRESSION
}
}
}
そして、extension
とextensionOrNull
の2つの新しいメソッドのいずれかを利用して参照するだけです。
webSocket("/echo") {
val myExtension = extension(MyWebSocketException)
// will throw if `MyWebSocketException` is not negotiated
val myExtension = extensionOrNull(MyWebSocketException) ?: close()
// will close the session if `MyWebSocketException` is not negotiated
}
これは実験的なAPIであり、フィードバックをお待ちしております。
サーバーセッションで封印されネストされたクラスのサポート
サーバーセッションオブジェクトに封印/ネストされたクラスを含めることができます。
data class MySession(val id: String, kind: UserInfo)
sealed class UserInfo() {
data class Admin(val drafts: List<String>) : UserInfo()
data class Reader(val ids: List<String>) : UserInfo()
}
install(Sessions) {
cookie<MySession>("SESSION")
}
OkHttp WebSocket作成のオーバーライド
WebSocketを作成するときに利用されるWebSocketOkHttpのWebSocket.Factory
を提供できるようになり、OkHttpを操作する際の柔軟性が向上します。
Chrisの貢献に感謝します。
適切な例外処理
Ktorは予期しない例外を正しく処理するようになりました。パイプラインで例外が発生した場合、実際の例外オブジェクトと共に 500 Internal Server Error
としてホストに返されます。これによりアプリケーション自体による例外処理が改善され、特定のステータスコード用にステータスページを構成する必要がなくなります。
上記の機能に加えて、1.5.0には他の機能とバグ修正も含まれています。
まとめ
翻訳は以上となります。自分がパッチノートを理解するためにまとめた記事になりますので、抜け漏れや間違いがありましたら編集リクエストをください。
新しい開発モードはぜひ活用したいところです。
全体的にはWebSocketまわりの機能が増えている印象です。
細かな使い勝手の部分(例外処理やネストしたクラスをセッションに設定可能になる)は地味ですが多くの人に恩恵があるのではないでしょうか