如果我使用 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/