我在继承的旧版系统中无法阅读此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标头并捕获字符串主体。在这种情况下,我对双冒号参数的含义感到困惑,因为它在第一次和第二次使用时会表现出不同。
答案 0 :(得分:1)
当您将链接发布到finch时,它是用于完成http服务的组合器API。
path
,param
,header
,cookie
,body
等的组合。请参见代码库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
。 {}
阻止您成为端点成功的对象。由于您正在编写header
和body
,因此请考虑它输出两个结果。在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 "