Skip to content
Server Plugin

XHttpMethodOverride

必須の依存関係: io.ktor:ktor-server-method-override

コード例: json-kotlinx-method-override

Native サーバー
Ktor は Kotlin/Native をサポートしており、追加のランタイムや仮想マシンなしでサーバーを実行できます。
のサポート: ✅

XHttpMethodOverride プラグインは、X-HTTP-Method-Override ヘッダー内で HTTP 動詞をトンネリング(tunneling)する機能を提供します。 これは、サーバー API が複数の HTTP 動詞(GETPUTPOSTDELETE など)を処理するものの、特定の制限によりクライアントが限られた一連の動詞(例えば GETPOST のみ)しか使用できない場合に役立ちます。 例えば、クライアントが X-Http-Method-Override ヘッダーを DELETE に設定してリクエストを送信した場合、Ktor はこのリクエストを delete ルートハンドラーを使用して処理します。

依存関係の追加

XHttpMethodOverride を使用するには、ビルドスクリプトに ktor-server-method-override アーティファクトを含める必要があります。

Kotlin
Groovy
XML

XHttpMethodOverride のインストール

XHttpMethodOverride プラグインをアプリケーションにインストールするには、指定された

モジュール
モジュールを使用すると、ルートをグループ化してアプリケーションを構造化できます。
内の install 関数に渡します。 以下のコードスニペットは、XHttpMethodOverride をインストールする方法を示しています...

  • ... embeddedServer 関数の呼び出し内。
  • ... Application クラスの拡張関数である、明示的に定義された module 内。
kotlin
kotlin

XHttpMethodOverride の設定

デフォルトでは、XHttpMethodOverrideX-Http-Method-Override ヘッダーをチェックして、リクエストを処理するべきルートを決定します。 headerName プロパティを使用して、ヘッダー名をカスタマイズできます。

以下の HTTP リクエストは、X-Http-Method-Override ヘッダーを DELETE に設定して POST 動詞を使用しています。

http
POST http://0.0.0.0:8080/customer/3
X-Http-Method-Override: DELETE

delete ルートハンドラーを使用してこのようなリクエストを処理するには、XHttpMethodOverride をインストールする必要があります。

kotlin
package com.example

import io.ktor.http.*
import io.ktor.serialization.kotlinx.json.*
import io.ktor.server.application.*
import io.ktor.server.plugins.contentnegotiation.*
import io.ktor.server.plugins.methodoverride.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
import kotlinx.serialization.*
import kotlinx.serialization.json.*
import io.ktor.server.util.getValue

@Serializable
data class Customer(val id: Int, val firstName: String, val lastName: String)

fun Application.main() {
    val customerStorage = mutableListOf<Customer>()
    customerStorage.addAll(
        arrayOf(
            Customer(1, "Jane", "Smith"),
            Customer(2, "John", "Smith"),
            Customer(3, "Jet", "Brains")
        )
    )

    install(XHttpMethodOverride)
    install(ContentNegotiation) {
        json(Json)
    }
    routing {
        get("/customer/{id}") {
            val id: Int by call.parameters
            val customer: Customer = customerStorage.find { it.id == id }!!
            call.respond(customer)
        }

        delete("/customer/{id}") {
            val id: Int by call.parameters
            customerStorage.removeIf { it.id == id }
            call.respondText("Customer is removed", status = HttpStatusCode.NoContent)
        }
    }
}

完全な例はこちらで確認できます: json-kotlinx-method-override