XHttpMethodOverride
必須の依存関係: io.ktor:ktor-server-method-override
コード例: json-kotlinx-method-override
XHttpMethodOverride プラグインは、X-HTTP-Method-Override ヘッダー内で HTTP 動詞をトンネリング(tunneling)する機能を提供します。 これは、サーバー API が複数の HTTP 動詞(GET、PUT、POST、DELETE など)を処理するものの、特定の制限によりクライアントが限られた一連の動詞(例えば GET と POST のみ)しか使用できない場合に役立ちます。 例えば、クライアントが X-Http-Method-Override ヘッダーを DELETE に設定してリクエストを送信した場合、Ktor はこのリクエストを delete ルートハンドラーを使用して処理します。
依存関係の追加
XHttpMethodOverride を使用するには、ビルドスクリプトに ktor-server-method-override アーティファクトを含める必要があります。
XHttpMethodOverride のインストール
XHttpMethodOverride プラグインをアプリケーションにインストールするには、指定された
install 関数に渡します。 以下のコードスニペットは、XHttpMethodOverride をインストールする方法を示しています... - ...
embeddedServer関数の呼び出し内。 - ...
Applicationクラスの拡張関数である、明示的に定義されたmodule内。
XHttpMethodOverride の設定
デフォルトでは、XHttpMethodOverride は X-Http-Method-Override ヘッダーをチェックして、リクエストを処理するべきルートを決定します。 headerName プロパティを使用して、ヘッダー名をカスタマイズできます。
例
以下の HTTP リクエストは、X-Http-Method-Override ヘッダーを DELETE に設定して POST 動詞を使用しています。
POST http://0.0.0.0:8080/customer/3
X-Http-Method-Override: DELETEdelete ルートハンドラーを使用してこのようなリクエストを処理するには、XHttpMethodOverride をインストールする必要があります。
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
