带有双冒号的Finch中的Scala Post方法

时间:2018-10-16 15:57:00

标签: scala post

我在继承的旧版系统中无法阅读此scala行。

post("tokens" :: Auth() :: stringBody) { (_: String, token: String) =>

如果需要的话,我可以在代码行的前后添加这些行,但是我认为这行本身对Scala开发人员来说具有一定的意义。

post方法来自finch库,这是方法签名和注释:

/**
   * A combinator that wraps the given [[Endpoint]] with additional check of the HTTP method. The
   * resulting [[Endpoint]] succeeds on the request only if its method is `POST` and the underlying
   * endpoint succeeds on it.
   */
  def post[A](e: Endpoint[A]): EndpointMapper[A] = new EndpointMapper[A](Method.Post, e)

我认为下划线是字符串的全部匹配项,但是此匹配项是什么?我认为它与post方法中的参数匹配,但是捕获了三个参数和两件事。

我假设方法与“令牌” REST端点值匹配,然后需要Auth标头并捕获字符串主体。在这种情况下,我对双冒号参数的含义感到困惑,因为它在第一次和第二次使用时会表现出不同。

1 个答案:

答案 0 :(得分:1)

当您将链接发布到finch时,它是用于完成http服务的组合器API。

  • 您将雀科端点组成为pathparamheadercookiebody等的组合。请参见代码库here < / li>
  • 您使用::运算符组合端点

Endpoint#:: has a definition as below

final def ::[B](other: Endpoint[B])(implicit pa: PairAdjoin[B, A]): Endpoint[pa.Out]

因此,在您的示例中,您必须使用path(可能是header)组成端点,并请求body{}阻止您成为端点成功的对象。由于您正在编写headerbody,因此请考虑它输出两个结果。在scala中,如果您不打算使用变量,则可以discard naming it with _

例如,List(1, 2).map(elem => elem * 2)等同于List(1, 2).map(_ * 2)

雀科端点的示例

  val auth = post("tokens" :: header[String]("auth") :: stringBody) {
    (authHeader: String, body: String) =>
      Ok(s"""
         {
            "auth": "$authHeader",
            "body": "$body"
         }
       """.stripMargin)
  }

  def main(args: Array[String]): Unit = {

    val endpoints: Service[Request, Response] = auth.toService

    Await.ready(Http.server.serve(":9090", endpoints))

  }

一旦运行它,就可以使用

使用终结点
$ curl --request POST -H "auth: some header" -d "some data" localhost:9090/tokens
"\n         {\n            \"auth\": \"some header\",\n            \"body\": \"some data\"\n         }\n       "