2016-01-22 36 views
0

如何尽可能折叠这些指令?如何折叠喷雾指令

我能够将三个指令折叠到mainHeader中,但如何包含authenticate和responseWithMediaType?

val mainHeaders = cors & headerValueByName("Access_Token") & headerValueByName("Tenant_Name") 

override def getLayer = path("api"/Segment/"model"/"layers") { modeledSystemName => 
    mainHeaders { (accessToken, tenantName) => 
     authenticate(validate(accessToken)) { authInfo => 
     respondWithMediaType(`application/json`) { 
      get { 
      onComplete(service.getlayers(modeledSystemName, tenantName)) { 
       case Success(layers) => complete(layers) 
       //case Success(None) => complete(NotFound, "Release version not found") 
       case Failure(ex) => complete(InternalServerError, s"An error occurred: ${ex.getMessage}") 
      } 
      } 
     } 
     } 
    } 
    } 

回答

2

喷雾路线超级合理,所以你可以做任何你想做的事情。例如,我会写这样的路线:

val authWithHeader = headerValueByName("Access_Token") 
    .flatMap(accessToken => authenticate(validate(accessToken))) 

val authenticatedJsonRoute = cors & 
    authWithHeader & 
    headerValueByName("Tenant_Name") & 
    respondWithMediaType(MediaTypes.`application/json`) 

override val getLayer = 
    (get & path("api"/Segment/"model"/"layers")) { modeledSystemName => 
    authenticatedJsonRoute { (authInfo, tenantName) => 
     onComplete(service.getlayers(modeledSystemName, tenantName)) { 
     case Success(layers) => complete(layers) 
     //case Success(None) => complete(NotFound, "Release version not found") 
     case Failure(ex) => complete(InternalServerError, s"An error occurred: ${ex.getMessage}") 
     } 
    } 
    } 

让我来解释一下这段代码。首先,我创建了读取标头值的指令authWithHeader,然后使用该值进行身份验证。这是超级简单,并通过flatMap完成的所有魔法。

然后,我创建了authenticatedJsonRoute,这只是其他简单指令的组合。使用&运算符完成构图魔术(我在此上下文中将其声明为“然后”),并且这些指令将按顺序执行。

最后,我在一条完整的路线getLayer中使用了我编写的指令authenticatedJsonRoute

+0

欢迎您:) –