2016-12-20 1 views
0

Ich würde gerne wissen, ob es eine Möglichkeit gibt, RPC beizutreten (so Client wissen, was er anrufen kann und Server wissen, worauf er reagieren sollte) und HTTP Rest (so anderer Client, ohne geteilte Codebasis kann einen Anruf tätigen).Typesafe RPC zwischen Client/Server, aber mit REST-Methoden

Es gibt eine Menge von http Bibliotheken für scala (akka-http, http4s, etc.) und es gibt gute RPC lib autowire. Aber ich sehe keinen Weg sie zu verbinden. Ich weiß, autowire ist Protokoll Agnostiker, aber es ist ein Nachteil hier, weil ich möchte, dass Routing in http-Layer (z. B. akka-http), nicht rpc (autowire) passiert.

Ich würde gerne wissen, ob es möglich ist. Wenn ja, wird eine Implementierung durchgeführt?

+0

Sieht aus wie TW bekam etwas im Gange https://github.com/ThoughtWorksInc/akka-http-rpc/blob/master/src/main/scala/com/thoughtworks/akka/http/RpcSupport.scala –

Antwort

1

endpoints ist eine Arbeit in Arbeit in dieser Richtung (Hinweis: Ich bin der Autor dieser Bibliothek). Es bietet die Möglichkeit, eine API zu definieren, die aus HTTP-Endpunkten besteht (zu verwendendes Verb, URL usw.) und dann Implementierungen bereitstellt, die solche APIs als Client oder als Server verwenden. Es ist mit Scala.js kompatibel, sodass Sie Ihre API-Definition zwischen der Clientseite und der Serverseite Ihrer Anwendung freigeben und von statisch typisierten Remoteaufrufen profitieren können.

Es bietet Ihnen die volle Kontrolle über die Verwendung von HTTP-Funktionen (z. B. Caching, Header, Authentifizierung usw.).

Hier ist eine grundlegende API-Definition mit zwei Endpunkten:

// POST /my-resources 
val create: Endpoint[CreateMyResource, MyResource] = 
    endpoint(post(path/"my-resources", jsonRequest[CreateMyResource]), jsonResponse[MyResource]) 

// GET /my-resources/:id 
val read: Endpoint[String, Option[MyResource]] = 
    endpoint(get(path/"my-resources"/segment[String]), option(jsonResponse[MyResource])) 

Sie können dann verwenden, wie von der Client-Seite folgt, einen tatsächlichen Anruf auszuführen:

val eventuallyResource: Future[MyResource] = 
    create(CreateMyResource("foo", 42)) 

val eventuallyResource2: Future[Option[MyResource]] = 
    read("abc123")