[英]Is there a Scala equivalent to JaxRS
如果我使用Java進行編碼,我可以將JaxRS用於我的REST API,並在服務器到服務器之間進行簡單的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的相同設置,最小的樣板...庫是否已經存在 - 或者我是否必須自己創建一個?
抱歉延遲,但是,我會回答這個問題,以幫助那些想知道相同的人。 ;)
Scala有大量的HTTP服務器,只有最少的樣板,但是,它們中的大多數與Java HTTP服務器(例如JAX-RS)有很大不同,並且大多數使用的代碼比Java代碼更少。 我要在這里列出一些。
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之上,也是Twitter庫。
我認為這是從Scala開始的好方法。 由於它是一種“類Java”庫,因此在提高生產效率之前不需要先進的FP概念。
class ExampleController @Inject()(exampleService: ExampleService) extends Controller {
get("/users") { request: Request =>
def eventualUsers: Future[List[User]] = _
eventualUsers
}
由於Finatra是基於Finagle構建的,因此它還需要非阻塞調用,並期望您返回Future
s。
Http4s也是一個很棒的圖書館,建立在fs2上並使用貓。 它是一個純粹的功能HTTP庫:
val userService = HttpService[IO] {
case GET -> Root / "users" =>
def eventualUsers: IO[List[User]] = _
Ok(eventualUsers)
}
雖然它使用純FP概念,但即使你是初學者,它的DSL也非常令人愉快。 它還需要非阻塞調用。
Finch也是一個Twitter庫,也是建立在Finagle之上的,它使用純FP概念來幫助您使用DSL構建簡單的REST apis:
def hello: Endpoint[Message] = get("users") {
def eventualUsers: Future[List[User]] = _
eventualUsers.map(Ok)
}
同樣在這里,Finch建立在Finagle上,因此它需要非阻塞調用。
我認為由你來決定。 所有這些都是非常成熟的工具來創建REST api,所以,閱讀每個文檔的文檔,看看你更喜歡哪一個。 ;)
[]的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.