是否有相当于 JaxRS 的 Scala

Che*_*tah 5 java rest scala

如果我使用 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 设置,并且使用最少的样板...是否已经存在一个库 - 还是我必须自己创建一个?

Gab*_*sco 2

很抱歉迟到了,但是我会回答这个问题,以帮助有同样疑问的人。;)

Scala 有大量具有最少样板的 HTTP 服务器,但是它们中的大多数与 Java HTTP 服务器(例如 JAX-RS)有很大不同,并且它们中的大多数使用的代码甚至比 Java 的还要少。我将在这里列出其中一些。

阿卡 HTTP

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 构建的,因此它也需要非阻塞调用并期望您返回Futures。

HTTP4S

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 的出色且非常成熟的工具,因此,请阅读每一个工具的文档,看看您更喜欢哪一个。;)

[]的