编写 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)
匹配。
我发现给猫皮的方法有很多,但是首选的写法风格是什么
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)
匹配。