我想知道是否有办法加入RPC(因此客户端知道他可以调用什么,服务器知道他应该响应什么)和HTTP Rest(所以任何其他客户端,没有共享代码库都可以调用) 。
scala(akka-http
,http4s
等)有很多http库,并且有很好的RPC lib autowire
。但我认为无法连接它们。我知道autowire
是协议无关的,但这是一个缺点,因为我想在http层(例如akka-http
)中发生路由,而不是rpc(autowire
)。
我想知道是否有可能。如果是,是否有任何实施正在进行中?
答案 0 :(得分:3)
endpoints正在朝着这个方向努力(注意:我是这个图书馆的作者)。它提供了定义由HTTP端点(要使用的动词,URL等)组成的API的方法,然后它提供了将这些API用作客户端或服务器的实现。它与Scala.js兼容,因此您可以在应用程序的客户端和服务器端共享API定义,并从静态类型检查的远程调用中受益。
它旨在让您完全控制HTTP功能的使用(例如缓存,标头,身份验证等)。
以下是具有两个端点的基本API定义:
// POST /my-resources
val create: Endpoint[CreateMyResource, MyResource] =
endpoint(post(path / "my-resources", jsonRequest[CreateMyResource]), jsonResponse[MyResource])
// GET /my-resources/:id
val read: Endpoint[String, Option[MyResource]] =
endpoint(get(path / "my-resources" / segment[String]), option(jsonResponse[MyResource]))
然后,您可以从客户端按如下方式使用它,以执行实际调用:
val eventuallyResource: Future[MyResource] =
create(CreateMyResource("foo", 42))
val eventuallyResource2: Future[Option[MyResource]] =
read("abc123")