KotlinとKTORでビルドREST API


スタックオーバーフローsurvey 2020年から、Kotlinは最も愛されたプログラミング言語のうちの1つであるので、Jetbrains(Kotlinを開発する会社)が優れた仕事をしていると言うのは安全です.KotlinはAndroidアプリケーションを開発するための言語として最もよく知られていますが、RESTful APIなどのバックエンドサービスの開発に使用できます.JetbrainsもKTLINとRESTful APIを開発するために使用することができますKTORという名前のフレームワークを開発しており、あなたが想像できるように、それはかなり素晴らしいです.

休憩とは
RESTは、代表的な状態転送のために短いです、インターネット通信のためにアーキテクチャのデザインと発展を導くためにつくられたソフトウェア建築様式です.RESTは、Webのようなインターネットスケールシステムのアーキテクチャがどのように振る舞うべきかについての一連の制約を定義します.

A Web API (or Web Service) conforming to the REST architectural style is a REST API.



ケーター
KTtorは、Kotlinプログラミング言語でJetbrainsによって作られるウェブフレームワークです.自分の言葉で

Ktor is a framework to easily build connected applications – web applications, HTTP services, mobile and browser applications. Modern connected applications need to be asynchronous to provide the best experience to users, and Kotlin coroutines provide awesome facilities to do it in an easy and straightforward way.


KTORフレームワークの主な目標は軽量で、独断的で、非同期で、安定していて、フレームワーク自体がどのような技術プロジェクトを使用しているかを課していないという意味です.

プラグイン
KTORは、その機能を拡張するプラグインの概念を使用します.プラグインは、シリアル化や圧縮などのアプリケーションロジックを拡張する一般的な機能のセットです.
例えば、KTORにおける典型的なリクエスト応答パイプライン

さて、KTORのプラグインを使用して、以前のリクエスト応答パイプラインを容易に拡張できるようになります.

あなたが要求応答パイプラインに加えるどのプラグインはあなたの好みとアプリケーションのニーズに依存します.認証が必要ですか?罰金、ちょうどプラグインをインストールします.例外処理?シリアル化?偉大な、単に簡単なプラグインのインストール.
プラグインは、プラグインとしてプラグインを使用するインストール関数を使用してサーバーの初期化フェーズ中に設定されます.プラグインをインストールするにはembeddedServer コール.
import io.ktor.features.*

fun main() {
    embeddedServer(Netty, port = 8080) {
        install(CORS)
        install(Compression)
        // ...
    }.start(wait = true)
}
または望ましいモジュール
import io.ktor.features.*

fun Application.module() {
    install(CORS)
    install(Compression)
    // ...
}
デフォルトでは、KTORはどんなプラグインも起動しません、そして、彼らのアプリケーションが必要とする機能をインストールするのは、開発者次第です.
私の個人的な好みのプラグインのいくつかは以下の通りです.
  • Status pages - 例外処理用
  • Serialization
  • Serving static content
  • CORS
  • JWT
  • 他のすべてのプラグインを使用して、頭をGenerate Ktor project ツール.

    ビルドレストAPI
    まず、KTORプロジェクトを作成する必要があります.つの方法を作成するにはGenerate Ktor project ツールまたはあなたが好むならばKtor plugin Intellijアイデア.
    プロジェクトが作成されると、すでにKTOR自体に必要なすべての依存関係が追加されている必要がありますが、シリアル化にはもう一つ必要です.
    依存:
    dependencies {
        implementation("io.ktor:ktor-server-core:$ktor_version")
        implementation("io.ktor:ktor-server-netty:$ktor_version")
        implementation("ch.qos.logback:logback-classic:$logback_version")
        implementation("io.ktor:ktor-serialization:$ktor_version")
        testImplementation("io.ktor:ktor-server-tests:$ktor_version")
        testImplementation("org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version")
    }
    
    それをシンプルにしてみましょうCustomer クラス.Kotlinのデータクラスとkotlinx.serialization クラスをJSONにシリアル化し、POST メソッド.我々はそれを簡単に維持されているので、アプリケーションは、メモリのストレージで使用されます.実際のアプリケーションの場合は、データベースを使用します.
    import kotlinx.serialization.Serializable
    
    val customerStorage = mutableListOf<Customer>()
    
    @Serializable
    data class Customer(val id: String, val firstName: String, val lastName: String, val email: String)
    
    次のステップはルートを定義することです.私たちはGET , POST , and DELETE リクエスト/customer エンドポイント.このように、我々のルートを対応するHTTPメソッドで定義しましょう.新しいファイルルーティングを加えましょう.
    ルーティング.KT
    fun Application.customerRouting() {
        routing {
            route("/customer") {
                get {
                    if (customerStorage.isNotEmpty()) {
                        call.respond(customerStorage)
                    } else {
                        call.respondText("No customers found", status = HttpStatusCode.NotFound)
                    }
                }
                get("{id}") {
                    val id = call.parameters["id"] ?: return@get call.respondText(
                        "Missing or malformed id",
                        status = HttpStatusCode.BadRequest
                    )
                    val customer =
                        customerStorage.find { it.id == id } ?: return@get call.respondText(
                            "No customer with id $id",
                            status = HttpStatusCode.NotFound
                        )
                    call.respond(customer)
                }
                post {
                    val customer = call.receive<Customer>()
                    customerStorage.add(customer)
                    call.respondText("Customer stored correctly", status = HttpStatusCode.Created)
                }
                delete("{id}") {
                    val id = call.parameters["id"] ?: return@delete call.respond(HttpStatusCode.BadRequest)
                    if (customerStorage.removeIf { it.id == id }) {
                        call.respondText("Customer removed correctly", status = HttpStatusCode.Accepted)
                    } else {
                        call.respondText("Not Found", status = HttpStatusCode.NotFound)
                    }
                }
            }
        }
    }
    
    最後のステップは、以前に定義されたルートを登録して、インストールすることですContentNegotiation KTORがシリアル化を処理できるようにプラグイン.
    アプリケーション.KT
    fun main(args: Array<String>): Unit =
        io.ktor.server.netty.EngineMain.main(args)
    
    fun Application.module() {
        install(ContentNegotiation) {
            json()
        }
        customerRouting()
    }
    
    偉大な、我々の単純な残りのAPIを使用して、それらの甘い顧客を処理する準備ができてCRUD 操作):)

    結論
    読んでいただきありがとうございます、そして、私はこの記事があなたに役に立つことを望みます!結論として、この記事はKTORフレームワーク、それへの導入とKTORとKotlinを使用して簡単なREST APIを構築する方法を行った.あなたがKtorに興味があるならばKtor documentation より徹底的なガイドと説明のために.
    あなたが私の内容が好きで、それが役に立つとわかるならば、私に続くことを考慮してください.あなたが寛大であるならば、考えてくださいbuying me a coffee .
    私と接続してください.