XHttpMethodOverride
必須の依存関係: io.ktor:ktor-server-method-override
コード例: json-kotlinx-method-override
[XHttpMethodOverride](https://api.ktor.io/ktor-server/ktor-server-plugins/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。