Scala模式与varargs匹配

Scala模式与varargs匹配,scala,Scala,我有一个web服务器来处理传入的请求。基于http方法和端点,我以不同的方式处理请求。目前代码处理它: def routes: HttpRequest => Future[HttpResponse] = { httpRequest: HttpRequest => (httpRequest.method, httpRequest.uri.path.toString) match { case (GET, "/login") => proces

我有一个web服务器来处理传入的请求。基于http方法和端点,我以不同的方式处理请求。目前代码处理它:

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,它提供了多种实现方法,可能比手工制作的版本更健壮。