使用自定义对象而不是Httpresponse时,如何获得响应代码

时间:2014-11-11 15:59:19

标签: scala spray spray-json

当我使用

val pipeline: HttpRequest => Future[HttpResponse] = addHeader(.......) ~> sendReceive ~>       unmarshal[HttpResponse]        

然后我可以使用

获取状态代码,因为它是HttpResponse的对象
val futureResponse = pipeline(Post(url, body)) futureResponse.map(_.status)

但是,当我使用自定义unmarshaller时:

val pipeline: HttpRequest => Future[MyResponse] = addHeader(.......) ~> sendReceive ~>      unmarshal[MyResponse]
使用

val myfutureResponse = pipeline(Post(url, body))
myutureResponse.map(_.status)

无法编译,因为它无法找到状态。我如何获取状态代码?我需要使用自定义的unmarshaller才能反序列化我的json结果。

2 个答案:

答案 0 :(得分:1)

如果您对管道中的非编组人员进行硬编码,则无法获得状态代码。您仍将获得失败代码,因为它们将成为导致Future失败的异常的一部分。

如果您真的想保留这些信息并在管道中使用非编组程序,则需要编写自己的非编组程序,以便为您提供此类响应:

case class Wrapper[T](response: T, status: StatusCode)

val pipeline: HttpRequest => Future[Wrapper[MyResponse]] = addHeader(.......) ~> sendReceive ~> myUnmarshall[MyResponse]

如果您不知道喷雾内部,这可能会非常棘手。另一个选择是不对硬件管道中的unmarshall位进行硬编码,并手动对JSON进行反序列化。

答案 1 :(得分:0)

最后我根据你的建议找到答案

private def unmarshal[T: Unmarshaller](response: HttpResponse): T = {
response.entity.as[T] match {
  case Right(value) => value
  case Left(error)  ⇒ throw new PipelineException(error.toString)
}

}

我将管道方法更改为

val pipeline: HttpRequest => HttpResponse = addHeader(.......) ~> sendReceive
val searchResponse = pipeline(Post(urlwithpath, queryString)).map {
  response => response.status match {
    case StatusCodes.OK =>
      Some(unmarshal[MyResponse](response))
    case StatusCodes.NotFound => print(StatusCodes.NotFound)
   }
}

现在我已经解决了这个问题,我将正确学习API