如何在方法scala中使用“某些情况下不适用”

问题描述 投票:0回答:1

我是Scala的新手。我正在尝试从Akka HTTP的optionalCookie方法获取Cookie。我想使用此optionalCookie(“ user_session”)的输出以其他方法传递。

如果我将其作为独立的API运行,则可以正常运行,并且我获得了cookie。为此,我做了类似的事情:

pathPrefix("datasession") {
  get {
    val route = optionalCookie("user_session") {
     case Some(nameCookie) => complete(s"The logged in user is '${nameCookie}'")
     case None             => complete("No user logged in")
    }
  route
}

将输出设为

The logged in user is 'user_session=af2845c271754888e4e78195c445a1514e4b9b04fbcfc7e02f23d1d2e4781f68 .....'

现在,我希望此输出以某种方法使用。为此,我做了这样的事情:

def autorequestService(session:String,jwttoken : String, requestInput: requestInput) : Future[HttpResponse] = {

   val pipeline: HttpRequest => Future[HttpResponse] = sendReceive  ~> unmarshal[HttpResponse]
   var sesionData = "";
   val route = optionalCookie("user_session") {
       case Some(nameCookie) => 
         sessionData = nameCookie
         complete(s"The logged in user is '${nameCookie}'")
       case None             => complete("No user logged in")
   }

   println("-------------- Session data ---------------------" +route.toString)
   val response: Future[HttpResponse] = pipeline(Get("http://some-url/completions")
    ~> addCredentials(BasicHttpCredentials("user", "pass"))
    ~> addHeader("SESSION", sesionData))
   response
}

但是我没有任何编译问题。但是在sessionData中,我没有得到cookie。如何在sessionData中获取cookie?

现在我尝试了这个:

val pipeline: HttpRequest => Future[HttpResponse] = sendReceive  ~> unmarshal[HttpResponse]


optionalCookie("user_session") {
    case Some(nameCookie) => 
        println("cokkkie " +nameCookie)
        pipeline(Get("http://some-url/completions")
          ~> addCredentials(BasicHttpCredentials("user", "pass"))
          ~> addHeader("SESSION", nameCookie.content))
    case None => complete("No user logged in")
}

found   : scala.concurrent.Future[spray.http.HttpResponse]
    required: spray.routing.RequestContext => Unit
    pipeline(Get("http://some-url/completions")
scala akka akka-http
1个回答
0
投票

您可以将Cookie处理代码移到匹配项的Some分支中。像这样(未经测试):

def autorequestService(session: String, jwttoken: String, requestInput: requestInput): Future[HttpResponse] = {

  val pipeline: HttpRequest => Future[HttpResponse] = sendReceive ~> unmarshal[HttpResponse]

  optionalCookie("user_session") {
    case Some(sessionData) =>
      println("-------------- Session data ---------------------" + route.toString)

      pipeline(Get("http://some-url/completions")
        ~> addCredentials(BasicHttpCredentials("user", "pass"))
        ~> addHeader("SESSION", sessionData))

    case None =>
      complete("No user logged in")
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.