1

当我使用

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

然后我可以使用 HttpResponse 获取状态代码作为它的对象

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

但是,当我使用自定义解组器时:

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

使用

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

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

4

2 回答 2

1

如果您在管道中对 un-marshaller 进行硬编码,则无法获得状态码。您仍然会得到失败代码,因为它们将成为导致Future失败的异常的一部分。

如果您真的想保留该信息并在您的管道中使用 un-marshaller,您将需要编写自己的 un-marshaller,它可以为您提供此类响应:

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

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

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

于 2014-11-11T16:07:57.973 回答
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

于 2014-11-16T05:43:03.397 回答