对于POST和PUT请求,我使用以下语法:
put {
entity(as[CaseClass]) { entity =>
returnsOption(entity).map(result => complete{(Created, result)})
.getOrElse(complete{(NotFound, "I couldn't find the parent resource you're modifying")})
}
}
现在对于GET请求我正在尝试做同样的事情,但我无法让它与我的PUT解决方案类似地工作。使用GET请求执行此操作的好方法是什么?
更新: 我已经使用了以下hack:
(get & parameters('ignored.?)) {
//TODO find a way to do this without ignored parameters
(ingored:Option[String]) => {
returnsOption().map(result => complete(result))
.getOrElse(complete{(NotFound, "")})
}
}
我希望() =>
或ctx =>
能够实现类似的功能,但这种情况不会发生,因为它会给编组带来麻烦:
... could not find implicit value for evidence parameter of type spray.httpx.marshalling.Marshaller[(spray.http.StatusCodes.ClientError, String)]
}).getOrElse(ctx.complete{(NotFound, "")})
^
这可能是因为这与我使用spray-json的事实有关吗?
答案 0 :(得分:15)
使用 HttpResponse ,例如
complete{
HttpResponse(StatusCodes.OK, HttpBody(ContentType(`text/html`), "test test: " + System.currentTimeMillis.toString))
}
更新:我一直在使用Spray一段时间了。原来有更好的方法:
complete {
StatusCodes.BandwidthLimitExceeded -> MyCustomObject("blah blah")
}
答案 1 :(得分:4)
此代码应该有效:
get {
ctx =>
ctx.complete(returnsOption())
}
如果一开始不使用ctx =>
,则代码可能只在路由构建时执行。
您可以在这里找到一些解释:Understanding the DSL Structure