使用 spray.client 从 http POST 解组错误 onFailure
Unmarshalling error onFailure from http POST with spray.client
我对 spray.io 和 scala 还很陌生,所以如果我在这里没有得到关于解组的术语,我提前道歉。
我正在尝试使用管道获取 HTTP POST 响应,预计会失败,因为我需要授权 header,但我们暂时忽略它。
如果我使用 chrome 扩展 Postman 到 POST 到 url,我得到这个响应,简单明了 json:
{"status":"error","message":"You must identify yourself to access this resource.","url":"https://scrive.com/login"}
所以我开始为这个响应创建我自己的案例 class,并实现我自己的 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 案例 运行s,但 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)
非常感谢您抽出宝贵时间,再次为我的错误术语道歉。
本例中的错误是一个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
returns直接。
我对 spray.io 和 scala 还很陌生,所以如果我在这里没有得到关于解组的术语,我提前道歉。
我正在尝试使用管道获取 HTTP POST 响应,预计会失败,因为我需要授权 header,但我们暂时忽略它。
如果我使用 chrome 扩展 Postman 到 POST 到 url,我得到这个响应,简单明了 json:
{"status":"error","message":"You must identify yourself to access this resource.","url":"https://scrive.com/login"}
所以我开始为这个响应创建我自己的案例 class,并实现我自己的 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 案例 运行s,但 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)
非常感谢您抽出宝贵时间,再次为我的错误术语道歉。
本例中的错误是一个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
returns直接。