Scala模式与varargs匹配
我有一个web服务器来处理传入的请求。基于http方法和端点,我以不同的方式处理请求。目前代码处理它:Scala模式与varargs匹配,scala,Scala,我有一个web服务器来处理传入的请求。基于http方法和端点,我以不同的方式处理请求。目前代码处理它: def routes: HttpRequest => Future[HttpResponse] = { httpRequest: HttpRequest => (httpRequest.method, httpRequest.uri.path.toString) match { case (GET, "/login") => proces
def routes: HttpRequest => Future[HttpResponse] = { httpRequest: HttpRequest =>
(httpRequest.method, httpRequest.uri.path.toString) match {
case (GET, "/login") =>
process(getLogin)
case (POST, "/newUser") =>
process(createNewUser)
..
但现在我需要支持一组这种形式的相关端点:
/{version}/{serviceName}
例如:
/0/userService
/0/bookService
因此,我希望更新现有代码以支持新端点:
case (POST, "/${version}/${service}) =>
if ($version == 0 && $service.equalToIgnoreCase("userService"))
process(user service)
if ($version == 0 && $service.equalToIgnoreCase("bookService"))
process(book service)
我该怎么做 您可以这样做:
val UrlPattern: scala.util.matching.Regex = """/(.*)/(.*)""".r
val path = "/0/userService"
path match {
case UrlPattern(version, service) => println(version, version)
}
上述代码将导致:
(0, userService)
正在打印到控制台,但您可以使用变量执行任何操作。您可以执行以下操作
val v0Services = (s: String) => s.toLowerCase match {
case "userservice" => userServiceV0()
case "bookservice" => bookServiceV0()
}
val v1Services = (s: String) => s.toLowerCase match {
case "userservice" => userServiceV1()
case "bookservice" => bookServiceV1()
}
val check = (v: String) => v match {
case "0" => v0Services
case "1" => v1Services
}
case (POST, "/${version}/${service}) => check(version)(service)
我建议使用一个web框架,比如Akka HTTP,它提供了多种实现方法,可能比手工制作的版本更健壮。