Scala 使用Akka HTTP的通用REST API?

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) 然后指定每个类应该接受的所有命令(或者

假设您有100个模型,并且对于所有这些模型,您希望客户端能够执行GET/POST/PUT/DELETE

我读了一些文章和其他文章,但即使有了这个有前途的标题,似乎每个模型都需要复制很多代码。一些人会称之为样板

理想情况下,我希望能够说

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为您生成所有这些锅炉板,但我从来没有这样做过这一直是可能的。具体的例子/文档可以做到这一点。我很肯定,在这条路上的某个地方,我会重新发明轮子。