Scala是否与JaxRS等效

时间:2017-12-05 08:37:45

标签: java scala rest

如果我使用Java进行编码,我可以在我的REST API中使用JaxRS,并在服务器到服务器之间进行简单的RPC设置。

我可以(大致)做到以下几点:

创建界面:

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

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

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

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

图书馆代码将为我完成所有连接并返回UsersApi的代理,我可以在其上调用getUsers()方法。

我希望在Scala中具有相同的简单性。由于Scala是一种JVM语言,我可以使用JaxRS,但是序列化程序提供程序是基于运行时的,它与Scala编译时类型不兼容。我可以对我使用的类型以及如何使用它们做出让步 - 我不是用Java,所以我不想在Scala中使用。

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

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

2 个答案:

答案 0 :(得分:1)

想到两个候选系统:

mu-rpc

“借助gRPC,mu可以在Scala程序中组合RPC协议,服务和客户端。”

autowire

“ Autowire是一对宏,允许您在Scala系统之间执行类型安全,无反射的RPC。Autowire允许您编写类型安全的Ajax / RPC调用……”

答案 1 :(得分:0)

很抱歉延迟了,但是,我将回答这个问题,以帮助那些同样知道的人。 ;)

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

Akka HTTP

基于Akka Streams,Akka HTTP提供了一个简单的DSL来创建REST端点:

def route =
  pathPrefix("users") {
    get {
      def eventualUsers: Future[List[User]] = _

      onSuccess(eventualUsers) { users =>
        complete(users)
      }
    }
  }

由于Akka HTTP是基于Akka流构建的,因此它需要非阻塞调用才能不阻塞默认调度程序。

Finatra

受Sinatra的启发,Finatra是由Twitter创建的HTTP和Thrift服务器。它建立在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上并使用cats。这是一个纯功能性的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的出色且非常成熟的工具,因此,请阅读每个文档,然后看看您更喜欢哪一个。 ;)

[]的