Ich wollte das wiederverwendbare generische Routing in Scala Akka-HTTP erstellen, so dass ich dasselbe generische Routing für den Rest des Routings verwenden konnte, das ich definierte.Wie kann ich generisches Routing in scala akka-http definieren
Bis jetzt konnte ich Routing als unten definieren, die perfekt funktioniert.
class TestApi(val modules: Configuration with PersistenceService)(implicit executionContext: ExecutionContext) extends BaseApi with CirceSupport {
override val oauth2DataHandler = modules.oauth2DataHandler
val userDao = new TestService
val testApi = pathPrefix("auth") {
path("users") {
pathEndOrSingleSlash {
get {
authenticateOAuth2Async[AuthInfo[OauthAccount]]("realm", oauth2Authenticator) {
//auth => complete(userService.getAll().map(_.asJson))
auth => complete(userDao.getAll().map(_.asJson))
}
}
}
} ~
path("allUsers") {
pathEndOrSingleSlash {
post {
entity(as[UserEntity1]) { userUpdate =>
authenticateOAuth2Async[AuthInfo[OauthAccount]]("realm", oauth2Authenticator) {
//auth => complete(userService.getAll().map(_.asJson))
auth => complete(userDao.getAll().map(_.asJson))
}
}
}
}
}
} ~
path("user"/"upload"/"file") {
pathEndOrSingleSlash {
post {
entity(as[Multipart.FormData]) { fileData =>
authenticateOAuth2Async[AuthInfo[OauthAccount]]("realm", oauth2Authenticator) {
auth => {
val fileName = UUID.randomUUID().toString
val temp = System.getProperty("java.io.tmpdir")
val filePath = "/var/www/html" + "/" + fileName
complete (
FileHandler.processFile(filePath,fileData).map { fileSize =>
("success", fileSize)
//HttpResponse(StatusCodes.OK, entity = s"File successfully uploaded. File size is $fileSize")
}.recover {
case ex: Exception => ("error", 0) //HttpResponse(StatusCodes.InternalServerError, entity = "Error in file uploading")
}.map(_.asJson)
)
}
}
}
}
}
}
}
Hier im Code finde ich pathEndOrSingleSlash
und
authenticateOAuth2Async[AuthInfo[OauthAccount]]("realm", oauth2Authenticator) {
auth => ...
}
repetative.
Ich möchte etwas wie unten, um mit zu arbeiten.
get(url, function)
post(url, function)
put(url, function)
Damit ich den Wiederholungscode wiederverwenden konnte. Wie kann ich das generische Routing wie definiert erreichen?
Thank you! Es funktioniert perfekt. Aber es funktioniert nicht für Path mit folgender Syntax: "user"/"edit"/IntVal, da Ihr Code String verwendet. Ich habe es mit PathMatcher0 versucht, aber vielleicht ist das nicht nur der Fall. – Sujit
Gern geschehen. Wenn du nicht 'IntVal' brauchst, was ist dann mit' commonRoute (("user"/"edit" /IntVal).toString, ...) '? Wenn Sie das IntVal brauchen, dann müssen Sie den Pfadpart möglicherweise abstrahieren, ähnlich wie ich den authentifizierten Teil abstrahierte ... –
Ich werde versuchen, Sie wissen zu lassen – Sujit