Java 是否存在与JaxRS等效的Scala

Java 是否存在与JaxRS等效的Scala,java,scala,rest,Java,Scala,Rest,如果我是用Java编码的,我可以在RESTAPI的服务器到服务器通信时使用JaxRS进行简单的RPC设置 我可以(大致)做到以下几点: 创建一个接口: public interface UsersApi { @Path("/users") @GET public List<User> getUsers(); } UsersApi usersApi = JAXRSClientFactory.create("localhost:8080", UsersApi.clas

如果我是用Java编码的,我可以在RESTAPI的服务器到服务器通信时使用JaxRS进行简单的RPC设置

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

创建一个接口:

public interface UsersApi {
   @Path("/users")
   @GET
   public List<User> getUsers();
}
UsersApi usersApi = JAXRSClientFactory.create("localhost:8080", UsersApi.class)
库代码将为我完成所有的连接,并返回一个
UsersApi
的代理,我可以在该代理上调用
getUsers()
方法

我希望在Scala中有同样的简单性。由于Scala是一种JVM语言,我可以只使用JAXR,但是序列化程序提供程序是基于运行时的,这不适合Scala编译时类型。我可以在使用哪种类型以及如何使用它们方面做出让步——我在Java中不这样做,所以我不想在Scala中这样做

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


最后,我的问题是,我如何在Java for Scala中获得与上面相同的REST API设置,并使用最少的样板文件…库是否已经存在?还是我必须自己创建一个库?

很抱歉延迟,但是,我将回答这个问题,以帮助那些对此感到疑惑的人。;)

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

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

def路由=
路径前缀(“用户”){
得到{
def事件分析器:未来[列表[用户]]=_
onSuccess(eventualUsers){users=>
完成(用户)
}
}
}
由于Akka HTTP构建在Akka Streams上,因此需要非阻塞调用才能不阻塞默认的调度程序

菲那特拉 受Sinatra的启发,Finatra是由Twitter创建的HTTP和节俭服务器。它建立在Finagle之上,也是一个Twitter库

我认为这是从斯卡拉开始的一个好方法。因为它是一种“类似Java”的库,所以在变得高效之前不需要高级的FP概念

class ExampleController @Inject()(exampleService: ExampleService) extends Controller {

  get("/users") { request: Request =>
    def eventualUsers: Future[List[User]] = _

    eventualUsers
  }
由于Finatra是基于Finagle构建的,因此它还需要非阻塞调用,并希望您返回
Future
s

Http4s Http4s也是一个很棒的库,它建立在fs2之上,使用cat。它是一个纯功能HTTP库:

val userService=HttpService[IO]{
案例获取->根用户/“用户”=>
def事件分析器:IO[列表[用户]]=_
Ok(最终结果)
}
尽管它使用纯FP概念,但它的DSL非常易于使用,即使您是初学者。它还需要非阻塞调用

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

def hello:Endpoint[Message]=get(“用户”){
def事件分析器:未来[列表[用户]]=_
eventualUsers.map(确定)
}
这里也是一样,Finch是建立在欺骗之上的,因此它需要非阻塞调用

哪一个更好? 我想由你来决定。所有这些工具都是非常棒而且非常成熟的创建RESTAPI的工具,因此,请阅读每一个工具的文档,看看您更喜欢哪一个


[]的

想到两种候选系统:

“得益于gRPC,mu能够在Scala程序中组合RPC协议、服务和客户端。”


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

这主要关注服务器,这是最简单的部分。我对客户端功能更感兴趣。使用JAXR,我不必维护单独的客户机……它们都运行在同一个接口上。