使用Play Framework 2.3的一段代码
def signup = Action(parse.json) { implicit request =>
val email = (request.body \ "email").asOpt[String]
val holder =
WS.url("https://foobar.com/foo")
.withAuth("1234","5678",WSAuthScheme.BASIC)
val data = Json.obj(
"email" -> email,
)
holder.post(data)
Ok("OK")
}
此代码将在我的计算机上本地运行时执行post(),但在远程计算机上不可靠。根据我的理解,post()调用应该创建并返回一个future,signup()返回Ok(),将来在默认的ExecutionContext上运行,并在某些时候完成并清理。显然事实并非如此。
我已经将函数更改为Action.async,现在正在等待Future:
val res = holder.post(data)
res.map( x => Ok(Json.obj("status" -> "OK"))) recover {
case (e: Exception) =>
InternalServerError(Json.obj("status" -> "Not OK."))
}
这可靠地运作。因此,我的问题是:
答案 0 :(得分:1)
几乎不可能说出为什么Future
无法可靠地完成"但是我猜测有什么东西您尝试联系的网络服务有问题。 SSL问题,未达到超时,......可能性很大而不知道抛出什么异常(如果有的话)。
如果您不想等待WS通话,可以使用onComplete
回调:
val res = holder.post(data)
res.onComplete {
case Success(response) =>
// Create some side-effect to the response
case Failure(e) =>
// The `Future` failed.
}