2016-01-22 76 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

歡迎您:) –