使用spray.client从http POST解组错误onFailure

时间:2015-01-05 15:45:47

标签: scala unmarshalling spray spray-client

对于这个问题,我对spray.io和scala很新,所以如果我在这里没有得到关于解组的术语,我会提前道歉。

我正在尝试使用管道获取HTTP POST响应,但由于我需要一个授权标头,因此预计会失败,但现在让我们忽略它。

如果我使用chrome扩展名邮递员POST到网址,我得到这个回复,简单明了json:

{"status":"error","message":"You must identify yourself to access this resource.","url":"https://scrive.com/login"}

所以我开始为这个响应创建我自己的case类,并实现了我自己的JsonProtocol,以解组响应。

case class CreateFromTemplateResult(status: String, message: String, url: String)

object ScriveJsonProtocol extends DefaultJsonProtocol {
  implicit val createFromTemplateResponseFormat = jsonFormat3(CreateFromTemplateResult)
}

所以现在我已经准备好了,运行我的管道,并收到响应。

val pipeline = sendReceive ~> unmarshal[CreateFromTemplateResult]

val response = pipeline {
   Post("https://api-testbed.scrive.com/api/v1/createfromtemplate/1")
}

response onComplete {
   case Success(CreateFromTemplateResult(status, message, url)) =>
      requestContext.complete("success")

   case Failure(error) =>
      requestContext.complete(error.getMessage)
    }

请求完成并且onFailure案例运行,但error.getMessage不再是json,就像之前的Postman示例一样。

Status: 403 Forbidden
Body: {"status":"error","message":"You must identify yourself to access this resource.","url":"https://scrive.com/login"}

所以我的问题变成了,如何解组返回的错误并将它的Body放入我的CreateFromTemplateResult案例中?或者只是进入json也会这样做。我不知道我的onSuccess案例是否也会起作用,我希望他们两者都有相同的行为。我希望它们是我定义的CreateFromTemplateResult格式。

 case class CreateFromTemplateResult(status: String, message: String, url: String)

非常感谢你的时间,我再次为我糟糕的术语道歉。

1 个答案:

答案 0 :(得分:3)

这种情况下的错误是UnsuccessfulResponseException(您可以从代码中看到unmarshall)。所以你可以特别匹配这个案例:

case Failure(e) => e match {
  case ure: UnsuccessfulResponseException =>
    val response = ure.response
    if(response.status = StatusCodes.Forbidden)
      complete(response.as[CreateFromTemplateResult])
    else ...
  case _ => ...
}

或者,您可能不想完全使用unmarshal(或编写自己的unmarshal),只需处理HttpResponse直接返回的sendReceive。< / p>