Typesafe RPC在客户端/服务器之间共享,但使用REST方法

时间:2016-12-20 06:53:20

标签: scala

我想知道是否有办法加入RPC(因此客户端知道他可以调用什么,服务器知道他应该响应什么)和HTTP Rest(所以任何其他客户端,没有共享代码库都可以调用) 。

scala(akka-httphttp4s等)有很多http库,并且有很好的RPC lib autowire。但我认为无法连接它们。我知道autowire是协议无关的,但这是一个缺点,因为我想在http层(例如akka-http)中发生路由,而不是rpc(autowire)。

我想知道是否有可能。如果是,是否有任何实施正在进行中?

1 个答案:

答案 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")