handleWith
Completes the request using the given function. The input to the function is produced with
the in-scope entity unmarshaller and the result value of the function is marshalled with
the in-scope marshaller. handleWith
can be a convenient method combining entity
with
complete
.
Signature
def handleWith[A, B](f: A ⇒ B)(implicit um: FromRequestUnmarshaller[A], m: ToResponseMarshaller[B]): Route
Description
The handleWith
directive is used when you want to handle a route with a given function of
type A ⇒ B. handleWith
will use both an in-scope unmarshaller to convert a request into
type A and an in-scope marshaller to convert type B into a response. This is helpful when your
core business logic resides in some other class or you want your business logic to be independent
of Spray. You can use handleWith
to “hand off” processing to a given function without requiring
any spray-specific functionality.
handleWith
is similar to produce
. The main difference is handleWith
automatically
calls complete
when the function passed to handleWith
returns. Using produce
you
must explicity call the completion function passed from the produce
function.
See marshalling and unmarshalling for guidance on marshalling entities with Spray.
Examples
The following example uses an updatePerson
function with a Person
case class as an input and output. We plug this function into our route using handleWith
.
case class Person(name: String, favoriteNumber: Int)
import PersonJsonSupport._
val updatePerson = (person: Person) => {
//... some processing logic...
//return the person
person
}
val route = post {
handleWith(updatePerson)
}
Post("/", HttpEntity(`application/json`, """{ "name": "Jane", "favoriteNumber" : 42 }""" )) ~>
route ~> check {
mediaType === `application/json`
responseAs[String] must contain(""""name": "Jane"""")
responseAs[String] must contain(""""favoriteNumber": 42""")
}
The PersonJsonSupport object handles both marshalling and unmarshalling of the Person case class.
object PersonJsonSupport extends DefaultJsonProtocol with SprayJsonSupport {
implicit val PortofolioFormats = jsonFormat2(Person)
}