当我使用
时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结果。
答案 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