XHttpMethodOverride
必須の依存関係: io.ktor:ktor-server-method-override
コード例: json-kotlinx-method-override
[XHttpMethodOverride](https://api.ktor.io/ktor-server-method-override/io.ktor.server.plugins.methodoverride/-x-http-method-override.html) プラグインは、X-HTTP-Method-Override ヘッダー内にHTTP動詞をトンネリングする機能を提供します。 これは、サーバー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リクエストは、POST動詞を使用し、X-Http-Method-OverrideヘッダーがDELETEに設定されています:
POST http://0.0.0.0:8080/customer/3
X-Http-Method-Override: DELETEこのようなリクエストをdelete ルートハンドラーを使用して処理するには、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。
