0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Ktor 1.5.0リリースノート(翻訳)

Posted at

この記事について

去る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
        }
    }
}

そして、extensionextensionOrNullの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まわりの機能が増えている印象です。
細かな使い勝手の部分(例外処理やネストしたクラスをセッションに設定可能になる)は地味ですが多くの人に恩恵があるのではないでしょうか

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?