Чтобы предоставить полный рабочий пример, я возьму такой класс case:
case class Test(foo: Int, bar: String)
И такие просьбы:
import com.twitter.finagle.http.{ Method, Request, RequestBuilder }
import com.twitter.io.{ Buf, Reader }
val queryParamPost = Request(Method.Post, "/test?foo=1&bar=whatever")
val testJsonBuf = Buf.Utf8("""{ "foo": 1, "bar": "whatever" }""")
val bodyPost = RequestBuilder().url("http://localhost:8080/test").buildPost(testJsonBuf)
Теперь, когда вы пишете следующее…
import io.finch._
val testParams: Endpoint[Test] = Endpoint.derive[Test].fromParams
val test: Endpoint[Test] = post("test" ? testParams) { test: Test =>
Created(test)
}
Что происходит, так это то, что Finch использует общий вывод (на основе Shapeless), чтобы определить (во время компиляции), как анализировать параметры запроса как Test
. Затем вы можете протестировать конечную точку следующим образом:
import io.finch.circe._
import io.circe.generic.auto._
test.toService.apply(queryParamPost).onSuccess { response =>
println(s"$response: ${ response.contentString }")
}
Который будет печатать:
Response("HTTP/1.1 Status(201)"): {"foo":1,"bar":"whatever"}
Здесь я использую общий вывод Circe для автоматического кодирования "созданного" Test
как JSON для ответа. .
Вы также можете использовать Circe для получения считывателя тела запроса:
val testBody: Endpoint[Test] = body.as[Test]
val test2: Endpoint[Test] = post("test" :: testBody) { test: Test =>
Created(test)
}
Это почти то же самое, что и test
выше, но мы используем body
, чтобы получить Endpoint[String]
, который будет читать тело запроса, а затем as
, чтобы указать, что мы хотим, чтобы контент анализировался как JSON и декодировался как значение Test
. Мы можем протестировать эту новую версию следующим образом:
test2.toService.apply(bodyPost).onSuccess { response =>
println(s"$response: ${ response.contentString }")
}
И мы снова получим ожидаемый ответ.
Обычно, когда вы хотите прочитать информацию определенного типа о входящем запросе, вы будете использовать один из основных Endpoint
, предоставляемых Finch (см. документы для получения более полного списка), а затем используйте такие методы, как as
, map
и т. д. для Endpoint
, чтобы придать ему нужную форму.
person
Travis Brown
schedule
01.05.2016