我要从Json响应返回String的Spray Client

谢格丁

抱歉,但是我是Scala的新手。我已经阅读了有关Futures和Akka的文章,但是仍然存在为我的方法返回字符串的问题。

我有一个方法getAuthString,它应该返回Authentication String(或Token)。我已经使用了喷雾Jsonsupport,并且可以打印结果

def getToken(url: String, username: String , password: String) = Future[String]{

import MyJsonProtocol._
import spray.httpx.SprayJsonSupport._

val pipeline: HttpRequest => Future[AuthTokenResult[Entry]] = (addCredentials(BasicHttpCredentials(username, password))
  ~> sendReceive
  ~> unmarshal[AuthTokenResult[Entry]]
  )
val myfutureResponse: Future[AuthTokenResult[Entry]] = pipeline(Get(url))

myfutureResponse onComplete {
      case Success(AuthTokenResult(Entry(Content(authString)):: _)) => println(authString)
      case Failure(error) => println("An error has occured: " + error.getMessage)
    }

这将解组json并打印所需的authString。但是,打印对我不利。我知道onComplete返回单位。我想返回authString,以便可以在其他请求的其他地方使用它。我想我将不得不使用平面地图或地图,但是我不确定如何使用。我需要我的方法返回authString或错误。

毫米

您不希望返回a String,而是想返回Future[String]a-一旦某件事是异步的,使其不异步的唯一方法是阻塞,这通常是浪费,使整个异步性变得毫无意义。

我不确定为什么要将两者都包装在一起Future-微不足道的计算可能会自己发生,将它们强制到单独的线程上几乎没有什么价值。所以你想要像这样的东西:

def getToken(url: String, ...): Future[String] = {
  ...
  val myFutureResponse: Future[AuthTokenResult[Entry]] = ...
  myFutureResponse map {
    case AuthTokenResult(Entry(Content(authString))::_) => authString
  }
}

因此,您可以通过计算map将aFuture转换为另一个Future这将“穿越”的错误,但你可以使用像recover或者recoverWith,如果你要处理他们在一个特定的方式。

然后,当您要Future[String]在喷涂路线中使用时,可以使用onSuccessonComplete指令:

val myRoute = (path("/somewhere") & parameter("authData") {
  authData =>
    onSuccess(getToken(authData)) {
      authToken =>
        complete("Authed as " + authToken)
    }
  }

这将以Future适当的异步,反应方式使用,而不会发生阻塞。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章