簡體   English   中英

Scala是否與JaxRS等效

[英]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 HTTP構建於Akka Streams上,提供了一個簡單的DSL來創建REST端點:

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

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

由於Akka HTTP是基於Akka Streams構建的,因此它需要非阻塞調用才能阻止默認調度程序。

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 s。

Http4s

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,所以,閱讀每個文檔的文檔,看看你更喜歡哪一個。 ;)

[]的

我想到了兩個候選系統:

畝-RPC

“由於gRPC,mu提供了在Scala程序中組合RPC協議,服務和客戶端的能力。”

自動裝配

“Autowire是一對宏,允許您在Scala系統之間執行類型安全,無反射的RPC .Autowire允許您編寫類型安全的Ajax / RPC調用......”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM