Xia*_*ong 7 web-services scala finch finagle
这是将请求参数绑定到路由器的代码.
val testReader: Endpoint[Test] = Endpoint.derive[Test].fromParams
val test: Endpoint[String] = post("test" ? testReader) { t : Test => {
Created("OK")
}}
Run Code Online (Sandbox Code Playgroud)
我正在使用这种方法fromParams.此方法可以非常酷的方式绑定请求参数.但是,我不知道哪种类似的方式可以绑定雀科中的请求体
提前谢谢了
为了提供一个完整的工作示例,我将假设一个这样的案例类:
case class Test(foo: Int, bar: String)
Run Code Online (Sandbox Code Playgroud)
还有一些请求:
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)
Run Code Online (Sandbox Code Playgroud)
现在当你写下面的内容......
import io.finch._
val testParams: Endpoint[Test] = Endpoint.derive[Test].fromParams
val test: Endpoint[Test] = post("test" ? testParams) { test: Test =>
Created(test)
}
Run Code Online (Sandbox Code Playgroud)
发生的事情是Finch正在使用泛型派生(由Shapeless提供)来确定(在编译时)如何将查询参数解析为Test.然后,您可以像这样测试端点:
import io.finch.circe._
import io.circe.generic.auto._
test.toService.apply(queryParamPost).onSuccess { response =>
println(s"$response: ${ response.contentString }")
}
Run Code Online (Sandbox Code Playgroud)
哪个会打印:
Response("HTTP/1.1 Status(201)"): {"foo":1,"bar":"whatever"}
Run Code Online (Sandbox Code Playgroud)
在这里,我使用Circe的泛型推导来自动将"created"编码Test为响应的JSON.
您还可以使用Circe为请求正文派生一个阅读器:
val testBody: Endpoint[Test] = body.as[Test]
val test2: Endpoint[Test] = post("test" :: testBody) { test: Test =>
Created(test)
}
Run Code Online (Sandbox Code Playgroud)
这几乎与test上面完全相同,但我们body用来获取一个Endpoint[String]将读取请求体,然后as指定我们希望将内容解析为JSON并解码为Test值.我们可以像这样测试这个新版本:
test2.toService.apply(bodyPost).onSuccess { response =>
println(s"$response: ${ response.contentString }")
}
Run Code Online (Sandbox Code Playgroud)
我们将再次得到我们期望的答案.
通常,当你想读某一种传入的请求的信息,您可以使用基本的一个Endpoint由芬奇提供S(参见该文档的完整列表),然后用类似的方法as,map等上在Endpoint把它变成你所需要的形状.