我应该如何使用不同的状态代码响应Spray中的GET请求?

时间:2013-04-01 13:27:51

标签: spray

对于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的事实有关吗?

2 个答案:

答案 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