从Scala Future映射数据
我正在实现一项任务,以调用Play Framework中的某个Rest端点,以下是我的服务中的代码:从Scala Future映射数据,scala,playframework,playframework-2.0,future,Scala,Playframework,Playframework 2.0,Future,我正在实现一项任务,以调用Play Framework中的某个Rest端点,以下是我的服务中的代码: override def getAccessToken(loginData: LoginData): Future[Unit] = { logger.info("get access token from HAT") val accessTokenURL = // This is the URL to be called logger.info(accessTokenUR
override def getAccessToken(loginData: LoginData): Future[Unit] = {
logger.info("get access token from HAT")
val accessTokenURL = // This is the URL to be called
logger.info(accessTokenURL)
ws
.url(accessTokenURL)
.withHttpHeaders(
HeaderNames.ACCEPT -> ContentTypes.JSON,
"username" -> loginData.username,
"password" -> loginData.password
)
.withRequestTimeout(timeout)
.get()
.map {
response => response.status match {
case Status.OK =>
val responseAsJson = response.json
Future.successful((responseAsJson \ "accessToken").as[String])
case _ =>
val message = (response.json \"message").asOpt[String]
throw new GeneralBadRequestException(message.get)
}
}
}
val accessTokenURL
的响应类似于:
{
"accessToken": "some token",
"userId": "some user id"
}
然后在我的控制器中,我编写了如下函数,以从上述服务获取数据:
private def handleAccessToken: LoginData => Future[Result] = { loginData =>
requestHATService.getAccessToken(loginData).map (
response => Ok(response)) recover {
case e =>
val errorJson: JsValue = Json.obj(
"status" -> "ERROR",
"error" -> Json.obj(
"code" -> "ERROR",
"message" -> e.getMessage
)
)
BadRequest(errorJson)
}
}
目前我正在努力的是函数handleAccessToken
中的response=>Ok(response))
部分,我想将其包含到Ok结果中,以在控制器响应中返回,但我无法取出数据,尤其是accessToken
,当我试图编译代码时,抛出如下错误:
无法将单元的实例写入HTTP响应。尝试定义一个
可写[单位]
编辑:感谢@Frederic的回答,我这里还有一个问题,我如何将响应字符串附加到某个JsValue并传递给Ok结果,比如
val successJson: JsValue = Json.obj("status" -> "OK")
requestHATService.getAccessToken(loginData).map (
response =>
// code to attach response to successJson here
Ok(successJson)) recover {
......
}
问题在于对以下各项的定义:
def getAccessToken(登录数据:登录数据):未来[单位]
应该是:
def getAccessToken(loginda:loginda):未来[String]
你需要更多的解释吗?hi@Frederic谢谢你的回答,是的,这就是问题所在。在本例中,我有另一个问题,如何将响应字符串附加到某个JsValue并传递到Ok结果?像构建错误响应一样构建它有什么不对?