【问题标题】:What is the best practice or style for writing Akka HTTP routes?编写 Akka HTTP 路由的最佳实践或风格是什么?
【发布时间】:2019-02-06 01:08:42
【问题描述】:

我发现有很多方法可以给猫剥皮,但首选的风格写作路线是什么

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

我将第一种样式称为 match-least-first,而将第二种样式称为 match-most-first。如果有人知道更好的名字,请告诉我。

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 路由等方面是否有其他考虑?

【问题讨论】:

  • 尝试阅读路由命名约定blog.mwaysolutions.com/2014/06/05/…
  • 谢谢。很好的参考,但不是我想要的。具体来说,我一直在寻找如何在 Akka HTTP 中定义路由,我的两个示例中哪一个是更好的样式,或者这个问题没有实际意义。

标签: scala akka akka-http


【解决方案1】:

以上样式都没有给您带来代码可维护性方面的任何优势。如果我必须选择其中一个,我会采用“最先匹配”的方法。这样做的原因是第一个匹配的路由被执行,所以更具体的路由定义应该首先执行。

以此为例

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 2021-09-24
    相关资源
    最近更新 更多