【发布时间】:2018-01-22 11:19:34
【问题描述】:
我正在执行一项任务以调用 Play Framework 中的某个 Rest Endpoint,这是我的服务中的代码:
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 Result 中以在控制器响应中返回,但我无法获取数据,尤其是@ 987654327@,当我尝试编译代码时,会抛出如下错误:
无法将 Unit 的实例写入 HTTP 响应。尝试定义一个 可写[单位]
编辑:感谢@Frederic 的回答,我这里还有一个问题,如何将响应字符串附加到一些 JsValue 并传递给 Ok Result,比如
val successJson: JsValue = Json.obj("status" -> "OK")
requestHATService.getAccessToken(loginData).map (
response =>
// code to attach response to successJson here
Ok(successJson)) recover {
......
}
【问题讨论】:
标签: scala playframework playframework-2.0 future