【问题标题】:Why Finch using EndPoint to represent Router, Request Parameter and Request Body为什么 Finch 使用 EndPoint 来表示 Router、Request Parameter 和 Request Body
【发布时间】:2016-05-02 00:51:37
【问题描述】:

在 finch 中,我们可以这样定义路由、请求参数、请求体。

  case class Test(name: String, age: Int)

  val router: Endpoint[Test] = post("hello") { Ok(Test("name", 30)) }
  val requestBody: Endpoint[Test] = body.as[Test]
  val requestParameters: Endpoint[Test] = Endpoint.derive[Test].fromParams

好处是我们可以将 EndPoint 组合在一起。例如,我可以定义:

请求路径是helloParameter应该有nameage。 (router :: requestParameters)

但是,我仍然可以成功运行不包含任何请求路径无效端点(实际上没有编译错误)

Await.ready(Http.serve(":3000", requestParameters.toService)) 

结果返回 404 not found page。即使我希望错误应该像编译错误一样早点报告。我想知道这是一个设计缺陷还是实际上是雀试图修复的?

在此先感谢

【问题讨论】:

    标签: web-services scala finagle finch


    【解决方案1】:

    首先,非常感谢您提出这个问题!

    让我让您了解一下 Finch 端点的工作原理。如果你讲类别理论,Endpoint 是一个 Applicative 嵌入 StateT 表示为接近 Input => Option[(Input, A)]

    简单地说,一个端点接受一个Input,它包装了一个HTTP请求并捕获了当前路径(例如:/foo/bar/baz)。当端点应用于给定请求并且匹配它(返回Some)或失败(返回None)。匹配时,它会更改Input 的状态,通常从中删除第一个路径段(例如:从/foo/bar/baz 中删除foo)因此下一个端点是链可以使用新的Input(并且新路径)。

    一旦端点匹配,Finch 会检查Input 中是否还有其他不匹配的内容。如果有遗漏,则匹配失败,您的服务返回 404。

    scala> val e = "foo" :: "bar"
    e: io.finch.Endpoint[shapeless.HNil] = foo/bar
    
    scala> e(Input(Request("/foo/bar/baz"))).get._1.path
    res1: Seq[String] = List(baz)
    

    当涉及到匹配/提取查询字符串参数的端点时,那里不会触及任何路径段,并且状态会不变地传递到下一个端点。因此,当应用端点param("foo") 时,路径不受影响。这只是意味着,服务一个查询字符串端点(注意:一个只提取查询字符串参数的端点)的唯一方法是向它发送一个带有空路径/的请求。

    scala> val s = param("foo").toService
    s: com.twitter.finagle.Service[com.twitter.finagle.http.Request,com.twitter.finagle.http.Response] = <function1>
    
    scala> s(Request("/", "foo" -> "bar")).get
    res4: com.twitter.finagle.http.Response = Response("HTTP/1.1 Status(200)")
    
    scala> s(Request("/bar", "foo" -> "bar")).get
    res5: com.twitter.finagle.http.Response = Response("HTTP/1.1 Status(404)")
    

    【讨论】:

      猜你喜欢
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-24
      相关资源
      最近更新 更多