代码之家  ›  专栏  ›  技术社区  ›  Timothy Perrigo

从Akka HTTP路由提取查询参数的警告消息

  •  1
  • Timothy Perrigo  · 技术社区  · 9 年前

    我第一次使用Akka HTTP,在构造路由以处理具有多个参数的GET请求时遇到了一些问题。这是我的路由的简化版本——它接受2个查询参数,然后将它们封装在一个case类中,并以JSON格式返回它们(使用Circe):

    def echo(latitude: Double, longitude: Double) = Future.successful { Coordinates(latitude, longitude) }
    
        val route = get {
          pathPrefix("foo") {
            path("echo") {
              parameters('latitude.as[Double], 'longitude.as[Double]) { 
                (latitude, longitude) =>
                  complete(echo(latitude, longitude))
            }
          }
        }
      }
    

    尽管这一切如期进行,但在编译过程中我收到了以下警告:

    “此处无自动调整:使用显式括号。[警告]
    akka.http.scaladsl.server.directions.ParameterDirectives.parammate): pdm。Out[warn]给定参数:scala.Symbol(“纬度”)。为[Double], 标量符号(“经度”)。作为[双精度]:
    参数('纬度.as[Double],'经度.as[Double]){(纬度, 经度)=>"

      val route = get {
        pathPrefix("foo") {
          path("echo" / DoubleNumber / DoubleNumber) { 
            (latitude, longitude) =>
              complete(echo(latitude, longitude))
        }
      }
    }
    

    如果有人知道我如何用第一条路径修复警告,或者让第二条路径工作,我将非常感谢您的帮助。此外,我正在研究的真正服务将有4个GET方法——不同的路径和返回类型,但它们都有相同的4个参数。有没有一种方法可以在编写路由时将样板文件最小化?再说一次,我对Akka HTTP很陌生,所以任何建议或建议都将不胜感激!

    提姆

    1 回复  |  直到 9 年前
        1
  •  3
  •   Stefano Bonetti    9 年前

    1) 编译器使用自动元组将您的参数包装在一起,在这种情况下,您可能有一个编译器标志抛出警告( scala -Ywarn-adapted-args ?). 解决方法是使元组显式,例如。

    parameters(('latitude.as[Double], 'longitude.as[Double])) {...}
    

    object Main extends App {
      val route = get {
        pathPrefix("foo") {
          path("echo" / DoubleNumber / DoubleNumber) {
            (latitude, longitude) =>
              complete(latitude + ":" + longitude)
          }
        }
      }
    
      implicit val sys = ActorSystem()
      implicit val mat = ActorMaterializer()
    
      Http().bindAndHandle(route, "0.0.0.0", 9080)
    }
    

    适用于以下请求

    http://localhost:9080/foo/echo/2.356/25.6346

    3) 关于将逻辑位提取到可重用函数的问题,就是这样 指令

      def extractLatLng(prefix: String): Directive[(Double, Double)] = path(prefix / DoubleNumber / DoubleNumber)
    
      val route = get {
        pathPrefix("foo") {
          extractLatLng("echo") { (lat, lng) ⇒
            complete(lat + ":" + lng)
          }
        }
      }