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

时间:2019-02-06 01:08:42

标签: scala akka akka-http

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

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")
    }
  }
}

我正在寻找更多的编码风格的可读性/可维护性,但是缺乏强烈的意识。我更喜欢第二种样式,因为我可以更轻松地看到最长的URL是什么,但是没有其他意见。

可能有一些性能方面的考虑,根据统计学上最需要的URL,但是我怀疑这是否有意义。

还有其他与功能编程风格,惯用的Scala,惯用的Spray路由等有关的注意事项吗?

1 个答案:

答案 0 :(得分:2)

以上样式均未对代码可维护性带来任何好处。如果必须选择其中一种,我会采用“最匹配比赛”方法。原因是执行了第一个匹配的路由,因此应首先使用更具体的路由定义。

以这个为例

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)匹配。