produce
Uses the marshaller for a given type to produce a completion function that is passed to its inner route. You can use it to decouple marshaller resolution from request completion.
Signature
def produce[T](marshaller: ToResponseMarshaller[T]): Directive[(T ⇒ Unit) :: HNil]
Description
The produce
directive works in conjuction with instanceOf
and spray.httpx.marshalling
to convert higher-level (object) structure into some lower-level serialized “wire format”.
The marshalling documentation explains this process in detail.
This directive simplifies exposing types to clients via a route while providing some
form of access to the current context.
produce
is similar to handleWith
. The main difference is with produce
you must eventually call the completion function generated by produce. handleWith
will automatically call
complete
when the handleWith
function returns.
Examples
The following example uses spray-json
to marshall a simple Person
class to a json
response. It utilizes SprayJsonSupport
via the PersonJsonSupport
object as the in-scope
unmarshaller.
object PersonJsonSupport extends DefaultJsonProtocol with SprayJsonSupport {
implicit val PortofolioFormats = jsonFormat2(Person)
}
case class Person(name: String, favoriteNumber: Int)
The findPerson
takes an argument of type Person => Unit
which is generated by the produce
call. We can handle any logic we want in findPerson
and call our completion function to
complete the request.
import PersonJsonSupport._
val findPerson = (f: Person => Unit) => {
//... some processing logic...
//complete the request
f(Person("Jane", 42))
}
val route = get {
produce(instanceOf[Person]) { completionFunction => ctx => findPerson(completionFunction) }
}
Get("/") ~> route ~> check {
mediaType === `application/json`
responseAs[String] must contain(""""name": "Jane"""")
responseAs[String] must contain(""""favoriteNumber": 42""")
}