Skip to main content

Method Directives

Method directives filter requests by their HTTP method. A request that does not match the required method is rejected with a MethodRejection.

get

Passes only GET requests. All other methods are rejected.

val route: Route = path("resource") {
get {
complete("GET response")
}
}

post

Passes only POST requests.

val route: Route = path("resource") {
post {
complete("POST response")
}
}

put

Passes only PUT requests.

val route: Route = path("resource") {
put {
complete("PUT response")
}
}

patch

Passes only PATCH requests.

val route: Route = path("resource") {
patch {
complete("PATCH response")
}
}

delete

Passes only DELETE requests.

val route: Route = path("resource") {
delete {
complete("DELETE response")
}
}

Passes only HEAD requests.

val route: Route = path("resource") {
head {
complete("HEAD response")
}
}

options

Passes only OPTIONS requests.

val route: Route = path("resource") {
options {
complete("OPTIONS response")
}
}

Combining Method Directives

Method directives are commonly combined with route concatenation to handle multiple methods on the same path:

val route: Route = path("resource") {
get {
complete("GET response")
} ~
post {
complete("POST response")
} ~
delete {
complete("DELETE response")
}
}

extractMethod

Extracts the HTTP method of the request as a Method value.

val route: Route = path("info") {
extractMethod { method =>
complete(s"Method: ${method.name}")
}
}

method

Matches a specific HTTP method value. This is the general form used internally by the convenience directives (get, post, etc.).

val route: Route = path("resource") {
method(Method.GET) {
complete("GET response")
}
}

overrideMethodWithParameter

Overrides the request HTTP method with the value of a query parameter. This is useful for supporting HTML forms or older browsers that only support GET and POST.

If the query parameter is not present, the directive has no effect. If the parameter value is not a valid HTTP method, the request is completed with 501 Not Implemented.

val route: Route = overrideMethodWithParameter("_method") {
path("resource") {
put {
complete("PUT via override")
} ~
delete {
complete("DELETE via override")
}
}
}
// POST /resource?_method=PUT -> handled as PUT
// POST /resource?_method=DELETE -> handled as DELETE