如何在akka http POST端点中处理这种类型的JSON请求?

8qgya5xd  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(151)

我有一个scala应用程序,它包含一个带有POST端点的akka http服务器。目前我在json请求中发送以下3个字段:

{
  "f1": "string1",
  "f2": "string2",
  "f3": "string3"
}
  • ModelRequest* 对象的代码如下所示:
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport
import spray.json.DefaultJsonProtocol

case class ModelRequest(f1: String, f2: String, f3: String)
object ModelJsonSupport extends DefaultJsonProtocol with SprayJsonSupport {
  implicit val PortofolioFormats = jsonFormat3(ModelRequest)
}

下面是我们在路由中使用此 ModelRequest 的方式:

val route = path("infer") {
      post {
        entity(as[ModelRequest]) { modelRequest =>
          complete(myFunc(modelRequest.f1, modelRequest.f2))
        }
      }
    }

现在,我想向端点发送可变数量的字段,而不是3个以上的任意数据类型的字段。我该怎么做呢?而且我只想从JSON输入中提取一个我知道其名称的字段。例如,现在我的请求可以如下所示:

{
    "f1":33,
    "g1": 44,
    "random_feat": "hello"
    ......
    ......
    "imp":{"feat1":"hi","feat2":4543}
}

从这个JSON请求中,我只想提取 “imp”,对于其余的字段,我不关心。5或20个字段,但我知道这肯定会有这个“imp”字段,我想在我的应用程序中使用。如何做到这一点?此外,这个完整的请求JSON将被转发到我的应用程序内部的其他POST端点,这也是我不知道如何做。请帮助,如果你有任何线索。- 谢谢-谢谢

htrmnn0y

htrmnn0y1#

默认情况下,spray忽略其他字段,它应该可以工作

final case class Request(imp: Imp)
final case class Imp(feat1: String, feat2: Long)

object Imp extends SprayJsonSupport with DefaultJsonProtocol {

  implicit val formatter = jsonFormat2(Imp.apply)
}

object Request extends SprayJsonSupport with DefaultJsonProtocol {

  implicit val formatter = jsonFormat1(Request.apply)
}

相关问题