编写 Akka HTTP 路由的最佳实践或风格是什么?

What is the best practice or style for writing Akka HTTP routes?

我发现给猫皮的方法有很多,但是首选的写法风格是什么

def leaderboardGet1(): Route = {
  get {
    pathEnd {
      parameter('name) { name =>
        complete(. . .)
      } ~
      complete(. . .)
    } ~
    pathPrefix(base64identifier) { leaderboardIdentifier =>
      pathEnd {
        complete(. . .)
      } ~
      pathPrefix(base64identifier) { memberIdentifier =>
        pathEnd {
          complete(. . .)
        }
      }
    } ~
    complete {
      HttpResponse(BadRequest, entity = "Bad GET /leaderboard request")
    }
  }
}

我将第一种样式称为最少优先匹配,第二种样式称为最多优先匹配。如果有人知道更好的名字请告诉我。

def leaderboardGet2(): Route = {
  get {
    pathPrefix(base64identifier) { leaderboardIdentifier =>
      pathPrefix(base64identifier) { memberIdentifier =>
        pathEnd {
          complete(. . .)
        }
      } ~
      pathEnd {
        complete(. . .)
        }
      }
    } ~
    pathEnd {
      parameter('name) { name =>
        complete(. . .)
        }
      } ~
      complete(. . .)
    } ~
    complete {
      HttpResponse(BadRequest, entity = "Bad GET /leaderboard request")
    }
  }
}

我更喜欢 readability/maintainability 编码风格,但感觉不强。我更喜欢第二种风格,因为我可以更容易地看到最长的 URL 是什么,但没有其他意见。

可能有一些性能方面的考虑,这取决于 URL 请求最多的统计数据,但我怀疑这是否重要。

关于函数式编程风格、惯用的 Scala、惯用的 Spray 路由等,是否还有其他一些注意事项?

None 以上样式在代码可维护性方面给您带来了任何优势。如果我必须选择其中之一,我会选择 "match-most-first" 方法。这样做的原因是第一个匹配的路由被执行,所以更具体的路由定义应该首先执行。

以此为例

get {
  pathPrefix(JavaUUID) { id =>
    pathEnd {
      complete(s"Got UUID $id")
    }
  } ~ pathPrefix(Segment) { someOtherId =>
    pathEnd {
      complete(s"Got Other ID $someOtherId")
    }
  }
}

因此,如果先处理 pathPrefix(Segment)pathPrefix(JavaUUID) 将永远不会得到结果,因为它也被 pathPrefix(Segment) 匹配。