如何在finch中组合多个端点

时间:2016-06-04 13:23:04

标签: scala finch

我正在尝试在启动http服务器时组合多个端点。 多个端点的定义如下:

  val foo = get("foo") { Ok("bar") }
  val test = get("test") { Ok("test") }

此代码正常运行

  foo :+: test

但是,此代码无效。

  List(foo, test).reduceLeft(_ :+: _)

错误是

 type mismatch;
 found   : io.finch.Endpoint[shapeless.:+:[String,shapeless.:+:[String,shapeless.CNil]]]
 required: io.finch.Endpoint[String]
 val controllers = List(foo, test).reduce(_ :+: _)
                                         ^

我不太明白为什么reduce不会在这里工作,在Finch中将Endpoint结合起来的最佳做法是什么

1 个答案:

答案 0 :(得分:3)

  

为什么减少不会在这里工作

如果您有url()x: Endpoint[String],则y: Endpoint[String]会返回x :+: y 1 - 重要的是不是Endpoint[Coproduct[String, String]]x

类型相同

查看y 2 签名:

reduce

您有List[A].reduce[A1 >: A](op: (A1, A1) ⇒ A1): A1 - List[Endpoint[String]]必须接受参数opx: Endpoint[String]并返回y: Endpoint[String] - 但Endpoint[String]将返回{ {1}}

  

在Finch中结合Endpoint的最佳做法

我还没有使用过Finch,但是repo中的所有示例都只是将端点与:+:

组合在一起

https://github.com/finagle/finch/blob/e3a62bf9a1cb26af40af428dd9be8b2dc3339c44/examples/src/main/scala/io/finch/todo/Main.scala#L83

Endpoint[Coproduct[String, String]]

如果您要在运行时操作元素,那么集合(如:+:)非常有用 - 您需要支持的用例吗?我通常发现我在编译时知道所有路线

<子> 1。使用getTodos :+: postTodo :+: deleteTodo :+: deleteTodos :+: patchTodo 类型签名进行了一些自由 - List而不是Coproduct

<子> 2。类似的论点适用于Coproduct[String, String]