Метод Скала Пост в Финче с двойным двоеточием - PullRequest
0 голосов
/ 16 октября 2018

У меня проблемы с чтением этой строки 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 "tokens", затем ожидает заголовок Auth и захватываеттело строкиМеня смущает, что в данном случае означает аргумент с двоеточием, так как он будет вести себя по-разному при первом и втором использовании.

1 Ответ

0 голосов
/ 19 октября 2018

Поскольку вы разместили ссылку на finch , это API-интерфейс комбинатора для службы finagle http.

  • Вы составляете конечную точку вьюрка как комбинацию path, param, header, cookie, body и т. Д., См. Кодовую базу здесь
  • вы объединяете конечную точку, используя оператор ::

Endpoint#:: имеет определение, как показано ниже :

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

Итак, в вашем примеревы должны составлять конечную точку с path, вероятно header и запросом body.В то время как {} блокирует ваш успех на конечной точке.Поскольку вы сочиняете header и body, подумайте о том, чтобы получить два результата.В scala, если вы не собираетесь использовать переменную, вы можете отменить ее присвоение _.

Например, 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       "
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...