如果我使用 Java 进行编码,我可以在服务器到服务器通信时将 JaxRS 用于我的 REST API,并通过简单的 RPC 设置。
我可以(大致)执行以下操作:
创建接口:
public interface UsersApi {
@Path("/users")
@GET
public List<User> getUsers();
}
Run Code Online (Sandbox Code Playgroud)
创建该接口的具体实现,将其作为路由添加到我的服务器代码中。
对于服务器端客户端,我可以创建一个 JaxRS 客户端,只知道我需要连接的接口/模型和端点:
UsersApi usersApi = JAXRSClientFactory.create("localhost:8080", UsersApi.class)
Run Code Online (Sandbox Code Playgroud)
库代码将为我完成所有接线工作,并返回一个代理UsersApi
,我可以为其调用该getUsers()
方法。
我希望在 Scala 中具有相同的简单性。由于 Scala 是一种 JVM 语言,我可以只使用 JaxRS,但是序列化程序提供程序是基于运行时的,它不适用于 Scala 编译时类型。我可以对我使用的类型以及我如何使用它们做出让步——我不使用 Java,所以我不想在 Scala 中使用。
我可以使用不同的序列化技术,但这意味着我的非服务器端客户端会遇到困难。
最终,我的问题是,我怎样才能获得与上面在 Java for Scala 中相同的 REST API 设置,并且使用最少的样板...是否已经存在一个库 - 还是我必须自己创建一个?
很抱歉迟到了,但是我会回答这个问题,以帮助有同样疑问的人。;)
Scala 有大量具有最少样板的 HTTP 服务器,但是它们中的大多数与 Java HTTP 服务器(例如 JAX-RS)有很大不同,并且它们中的大多数使用的代码甚至比 Java 的还要少。我将在这里列出其中一些。
Akka HTTP 基于 Akka Streams 构建,提供了一个简单的 DSL 来创建 REST 端点:
def route =
pathPrefix("users") {
get {
def eventualUsers: Future[List[User]] = _
onSuccess(eventualUsers) { users =>
complete(users)
}
}
}
Run Code Online (Sandbox Code Playgroud)
由于 Akka HTTP 是基于 Akka Streams 构建的,因此它需要非阻塞调用,以免阻塞默认调度程序。
受 Sinatra 的启发,Finatra 是 Twitter 创建的 HTTP 和 Thrift 服务器。它构建在 Finagle 之上,Finagle 也是一个 Twitter 库。
我认为这是开始使用 Scala 的好方法。由于它是一种“类似 Java”的库,因此在变得高效之前不需要高级的 FP 概念。
class ExampleController @Inject()(exampleService: ExampleService) extends Controller {
get("/users") { request: Request =>
def eventualUsers: Future[List[User]] = _
eventualUsers
}
Run Code Online (Sandbox Code Playgroud)
由于 Finatra 是基于 Finagle 构建的,因此它也需要非阻塞调用并期望您返回Future
s。
Http4s 也是一个很棒的库,它基于 fs2 构建并使用 cats。它是一个纯函数式 HTTP 库:
class ExampleController @Inject()(exampleService: ExampleService) extends Controller {
get("/users") { request: Request =>
def eventualUsers: Future[List[User]] = _
eventualUsers
}
Run Code Online (Sandbox Code Playgroud)
尽管它使用纯粹的 FP 概念,但它的 DSL 使用起来非常愉快,即使您是初学者也是如此。它还需要非阻塞调用。
Finch 也是一个 Twitter 库,也构建在 Finagle 之上,它使用纯 FP 概念来帮助您使用其 DSL 构建简单的 REST api:
val userService = HttpService[IO] {
case GET -> Root / "users" =>
def eventualUsers: IO[List[User]] = _
Ok(eventualUsers)
}
Run Code Online (Sandbox Code Playgroud)
同样,Finch 是基于 Finagle 构建的,因此它需要非阻塞调用。
我认为这由你来决定。它们都是用于创建 REST api 的出色且非常成熟的工具,因此,请阅读每一个工具的文档,看看您更喜欢哪一个。;)
[]的
归档时间: |
|
查看次数: |
404 次 |
最近记录: |