Scala 使用Akka HTTP的通用REST API?
假设您有100个模型,并且对于所有这些模型,您希望客户端能够执行GET/POST/PUT/DELETE 我读了一些文章和其他文章,但即使有了这个有前途的标题,似乎每个模型都需要复制很多代码。一些人会称之为样板 理想情况下,我希望能够说Scala 使用Akka HTTP的通用REST API?,scala,rest,akka,akka-http,Scala,Rest,Akka,Akka Http,假设您有100个模型,并且对于所有这些模型,您希望客户端能够执行GET/POST/PUT/DELETE 我读了一些文章和其他文章,但即使有了这个有前途的标题,似乎每个模型都需要复制很多代码。一些人会称之为样板 理想情况下,我希望能够说 case class AwesomeCaseClass(primeNumber : Long) case class EvenMoreAwesomeCaseClass(favoritePrimeNumber : Long) 然后指定每个类应该接受的所有命令(或者
case class AwesomeCaseClass(primeNumber : Long)
case class EvenMoreAwesomeCaseClass(favoritePrimeNumber : Long)
然后指定每个类应该接受的所有命令(或者像UPSERT这样的东西)
我找不到这样做的人,有人能提供一个链接或指向正确方向的指针吗
在谷歌搜索时,我也遇到过,但对于Akka HTTP来说,似乎只有对API文档的支持
以下是我迄今为止的尝试:
package route
import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model.HttpResponse
import akka.http.scaladsl.server.Route
import akka.stream.ActorMaterializer
import scala.reflect._
import akka.http.scaladsl.server.Directives._
import akka.http.scaladsl.unmarshalling.FromRequestUnmarshaller
/**
* Created by flyrev on 30.05.16.
*/
case class Test(name: String)
class REST[T](implicit um: FromRequestUnmarshaller[T]) {
def generateRoute(klazz: Class[_]) : Route = {
path("test" / klazz.getSimpleName) {
get {
complete(HttpResponse(entity = "OK", status = 200))
} ~ post {
entity(as[T]) {
// Insert into DB here
(zomg) => complete(HttpResponse(entity = "Would have POSTed that stuff", status = 200))
}
}
} ~ get {
complete(HttpResponse(entity="Not found", status=404))
}
}
}
object GenerateRouteFromClass extends App {
def runtimeClass[T: ClassTag] = classTag[T].runtimeClass
implicit val system = ActorSystem()
implicit val materializer = ActorMaterializer()
import argonaut._
import CodecJson.derive
implicit val um = derive[Test]
Http().bindAndHandle(new REST[Test].generateRoute(runtimeClass[Test]), "localhost", 8080)
}
然而,这使:
Error:(45, 24) could not find implicit value for parameter um: akka.http.scaladsl.unmarshalling.FromRequestUnmarshaller[route.Test]
Http().bindAndHandle(new REST[Test].generateRoute(runtimeClass[Test]), "localhost", 8080)
^
Error:(45, 24) not enough arguments for constructor REST: (implicit um: akka.http.scaladsl.unmarshalling.FromRequestUnmarshaller[route.Test])route.REST[route.Test].
Unspecified value parameter um.
Http().bindAndHandle(new REST[Test].generateRoute(runtimeClass[Test]), "localhost", 8080)
^
这不是问题的答案,但我认为要求用户修改单个模型案例类的REST API不是一个很好的API。不确定您的意思-理想情况下,我只讨论案例类的注释(或者只讨论类,如果需要的话)。您查看了
宏了吗?我认为您能够注释case类,并使用macro为您生成所有这些锅炉板,但我从来没有这样做过这一直是可能的。具体的例子/文档可以做到这一点。我很确定,在这条路上的某个地方,我会重新发明轮子。这不是问题的答案,但我认为要求用户修改单个模型案例类的REST API不是一个很好的API。我不确定你的意思——理想情况下,我只讨论案例类的注释(或者只讨论类,如果需要的话).你检查过宏吗?我认为您能够注释case类,并使用macro为您生成所有这些锅炉板,但我从来没有这样做过这一直是可能的。具体的例子/文档可以做到这一点。我很肯定,在这条路上的某个地方,我会重新发明轮子。