首页 > 解决方案 > Scala 模式匹配与可变参数

问题描述

我有一个 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)

我怎样才能做到这一点?

标签: scala

解决方案


你可以这样做:

val UrlPattern: scala.util.matching.Regex = """/(.*)/(.*)""".r
val path = "/0/userService"  

path match {
    case UrlPattern(version, service) => println(version, version)
}

上面的代码将导致:

(0, userService)

被打印到控制台,但你可以使用任何你想要的变量。


推荐阅读