【问题标题】:Map data from a Scala Future来自 Scala Future 的映射数据
【发布时间】: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


    【解决方案1】:

    问题出在以下定义中: def getAccessToken(loginData: LoginData): Future[Unit]

    应该是: def getAccessToken(loginData: LoginData): Future[String]

    您需要更多解释吗?

    【讨论】:

    • 嗨@Frederic 感谢您的回答,是的,这就是问题所在。在这种情况下,我还有一个问题,如何将响应字符串附加到某个 JsValue 并传递给 Ok Result?
    • 像构建错误响应一样构建它有什么问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 2022-12-11
    • 2018-06-15
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 2015-10-02
    相关资源
    最近更新 更多