首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Finch中绑定请求体

如何在Finch中绑定请求体
EN

Stack Overflow用户
提问于 2016-05-01 12:48:31
回答 1查看 2K关注 0票数 7

下面是将请求param绑定到路由器的代码。

代码语言:javascript
复制
val testReader: Endpoint[Test] = Endpoint.derive[Test].fromParams
val test: Endpoint[String] = post("test" ? testReader) { t : Test => {
    Created("OK")
  }}

我正在使用fromParams方法。该方法可以以非常酷的方式绑定请求参数。但是,我不知道如何将请求体绑定到芬奇

事先非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-01 19:29:10

为了提供一个完整的工作示例,我将假设一个案例类如下所示:

代码语言:javascript
复制
case class Test(foo: Int, bar: String)

像这样的请求:

代码语言:javascript
复制
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)

现在,当您编写以下…时

代码语言:javascript
复制
import io.finch._

val testParams: Endpoint[Test] = Endpoint.derive[Test].fromParams
val test: Endpoint[Test] = post("test" ? testParams) { test: Test =>
  Created(test)
}

正在发生的事情是,Finch正在使用泛型派生(由无形驱动)来确定(在编译时)如何将查询params解析为Test。然后,您可以像这样测试端点:

代码语言:javascript
复制
import io.finch.circe._
import io.circe.generic.auto._

test.toService.apply(queryParamPost).onSuccess { response =>
  println(s"$response: ${ response.contentString }")
}

它将打印:

代码语言:javascript
复制
Response("HTTP/1.1 Status(201)"): {"foo":1,"bar":"whatever"}

这里,我使用切尔斯的泛型派生将“创建”的Test自动编码为响应的JSON。

还可以使用Circe派生请求主体的读取器:

代码语言:javascript
复制
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值。我们可以像这样测试这个新版本:

代码语言:javascript
复制
test2.toService.apply(bodyPost).onSuccess { response =>
  println(s"$response: ${ response.contentString }")
}

我们会再次得到我们期待的答案。

通常,当您想要读取传入请求的某种信息时,您将使用Finch提供的基本Endpoint之一(更完整的列表请参见医生们 ),然后在Endpoint上使用asmap等方法将其转换为所需的形状。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36966835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档