java - 有没有等同于 JaxRS 的 Scala

标签 java scala rest

如果我使用 Java 进行编码,我可以将 JaxRS 用于我的 REST API,并在服务器到服务器通信时轻松设置 RPC。

我可以(大致)执行以下操作:

创建界面:

public interface UsersApi {
   @Path("/users")
   @GET
   public List<User> getUsers();
}

创建该接口(interface)的具体实现,将其作为路由添加到我的服务器代码中。

对于服务器端客户端,我可以创建一个 JaxRS 客户端,只知道接口(interface)/模型和我需要连接到的端点:

UsersApi usersApi = JAXRSClientFactory.create("localhost:8080", UsersApi.class)

库代码会为我完成所有连接,并返回一个 UsersApi 的代理,我可以调用 getUsers() 方法。

我希望在 Scala 中具有同样的简单性。由于 Scala 是一种 JVM 语言,我可以只使用 JaxRS,但是序列化程序提供程序是基于运行时的,这不能很好地与 Scala 编译时类型一起工作。我可以在使用哪些类型以及如何使用它们方面做出让步 - 我不使用 Java,所以我不想使用 Scala。

我可以使用不同的序列化技术,但这意味着我的非服务器端客户端会遇到困难。

最终,我的问题是,我如何才能为我的 REST API 获得与上面在 Java for Scala 中相同的设置,同时使用最少的样板文件...库是否已经存在 - 或者我是否必须自己创建一个?

最佳答案

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

有大量用于 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)
      }
    }
  }

由于 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
  }

由于 Finatra 是基于 Finagle 构建的,它还需要非阻塞调用并期望您返回 Future

HTTP4s

也是一个很棒的库,Http4s 建立在 fs2 上并使用 cat。它是一个纯函数式 HTTP 库:

val userService = HttpService[IO] {
  case GET -> Root / "users"  =>
    def eventualUsers: IO[List[User]] = _

    Ok(eventualUsers)
}

虽然它使用纯 FP 概念,但它的 DSL 非常易于使用,即使您是初学者也是如此。它还需要非阻塞调用。

芬奇

Finch 也是一个 Twitter 库,也是建立在 Finagle 之上的,它使用纯 FP 概念帮助您使用其 DSL 构建简单的 REST api:

def hello: Endpoint[Message] = get("users") {
  def eventualUsers: Future[List[User]] = _

  eventualUsers.map(Ok)
}

这里也一样,Finch 是基于 Finagle 构建的,因此它需要非阻塞调用。

哪个更好?

我认为这取决于您的决定。它们都是用于创建 REST api 的很棒且非常成熟的工具,因此,请阅读每个工具的文档,看看您更喜欢哪一个。 ;)

[]的

关于java - 有没有等同于 JaxRS 的 Scala,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47649240/

相关文章:

java - java中的synchronized "deep"是同步的吗?

java - 为什么 Java 编译器不优化一个简单的方法?

scala - 匿名函数的参数类型必须是完全已知的。 (SLS 8.5)

scala - Intellij-idea 中的 scala 类、脚本和工作表有什么区别?

json - 将 $skip 与 SharePoint 2013 REST API 一起使用

ruby-on-rails - rails send_data 在使用 POST 发送 Excel 文件时不发送任何内容

java - 在 Weka Java API 中创建字符串属性

scala - 当子actor在未来的onFailure内抛出异常时,Akka主管actor不会处理异常

wordpress - WP REST API 如何上传特色图片?

java - 这些通用声明之间有什么区别?