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

时间:2017-06-27 11:24:45

标签: scala akka akka-http

我第一次使用Akka-HTTP并且在构建处理具有多个参数的GET请求的路由时遇到了一些问题。这是我的路线的简化版本 - 它接受2个查询参数,然后将它们包装在案例类中并以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))
        }
      }
    }
  }

虽然这可以按预期工作,但我在编译期间收到以下警告:

  

"这里没有自动适应:使用明确的括号。 [警告]
  签名:ParameterDirectives.parameters(pdm:   akka.http.scaladsl.server.directives.ParameterDirectives.ParamMagnet):   pdm.Out [warn]给出参数:scala.Symbol("纬度")。作为[Double],   scala.Symbol("经度")。改编后[双] [警告]:   ParameterDirectives.parameters((scala.Symbol("纬度")为[双]   scala.Symbol("经度&#34)为[双])。:   akka.http.scaladsl.server.directives.ParameterDirectives.ParamMagnet {式   Out = akka.http.scaladsl.server.Directive [(Double,Double)]})[warn]
  参数(' latitude.as [Double],' longitude.as [Double]){(纬度,   经度)=>"

按照不同的例子,我尝试了以下路线,但是虽然它编译时没有任何警告,但它总是返回404:

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

如果有人知道如何通过第一条路线修复警告或让第二条路线发挥作用,我真的很感激帮助。此外,我正在处理的实际服务将有4个GET方法 - 不同的路径和返回类型,但它们都将具有相同的4个参数。有没有办法在编写路径时最小化样板?再说一遍,我对Akka-HTTP很新,所以任何建议或建议都会非常感激!

谢谢, 添

1 个答案:

答案 0 :(得分:3)

1)编译器将您的参数与自动整理一起包装,并且您可能有一个编译器标志,在这种情况下会引发警告(scala -Ywarn-adapted-args?)。修复方法是将元组显式化,例如

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

2)这个看起来很好。样本主要在

下面
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)关于将逻辑位提取到可重用函数的问题,指令的用途是什么。假设您要提取匹配lat和lng params的位,您可以执行以下操作:

  def extractLatLng(prefix: String): Directive[(Double, Double)] = path(prefix / DoubleNumber / DoubleNumber)

  val route = get {
    pathPrefix("foo") {
      extractLatLng("echo") { (lat, lng) ⇒
        complete(lat + ":" + lng)
      }
    }
  }