Scala 基于请求内容类型的不同路由喷洒路由1.2.1

Scala 基于请求内容类型的不同路由喷洒路由1.2.1,scala,spray,json4s,spray-dsl,Scala,Spray,Json4s,Spray Dsl,我想支持提交到同一URL的两种不同内容类型: e、 g: application/x-www-form-urlencoded,multipart/form data,application/json 我想做一些类似的事情: post { contentType(`application/x-www-form-urlencoded`) | contentType(`multipart/form-data`) { // user POSTed a form entity

我想支持提交到同一URL的两种不同内容类型:

e、 g:

application/x-www-form-urlencoded
multipart/form data
application/json

我想做一些类似的事情:

post {
  contentType(`application/x-www-form-urlencoded`) | 
  contentType(`multipart/form-data`) {
     // user POSTed a form
     entity(as[MyCaseClass]) { data =>
        complete { data.result }
     }
  } ~ contentType(`application/json`) {
     // user POSTed a JSON object
     entity(as[MyCaseClass]) { data =>
        complete { data.result }
     }
  }
}

我认为可能有一些方法可以通过自定义封送和解封送来实现这一点,但我只需要在我的服务中的一个或两个位置使用它,这看起来非常简单。有人能帮忙吗?

由于喷雾编组系统的高度智能,有一种非常优雅的方法可以实现这一点。代码()说明了这一点:

case类用户(名称:String,编号:Int)
//Json马歇尔勒
对象解组扩展了DefaultJsonProtocol{
val jsonUser=jsonFormat2(用户)
val textUser=Unmarshaller[User](`text/plain`){
案例HttpEntity.NonEmpty(contentType,data)=>
val res=data.asString.drop(5).dropRight(1).split(','))
用户(res(0),res(1).toInt)
}
隐式val usermarshall=Unmarshaller.oneOf(jsonUser,textUser)
}
类UnMarshalTest使用带有匹配器的ScalateStroutTest扩展FunSpec{
导入解组_
//根据Accept标头媒体类型封送响应
val putOrder=路径(“用户”){
放{
//命名空间与ScalaTestRoutes.entity冲突
MarshallingDirections.entity(作为[用户]){
用户=>
完成(s“no=${user.no}”)
}
}
}
描述(“我们的路线应该”){
val json=“{”name:“bender”,“no”:1234}”
它(“提交json”){
Put(“/user”,HttpEntity(`application/json`,json))~>putOrder~>check{
响应[String]应等于(“no=1234”)
}
}
它(“提交文本”){
Put(“/user”,HttpEntity(`text/plain`,“”“user(Zoidberg,322)”)~>putOrder~>check{
响应[String]应等于(“no=322”)
}
}
}
}

Wow,这是一个信息量惊人的答案——但我正在寻找两种方法,根据请求的内容类型来解组传入的发布数据。无论请求采用何种格式,我都会输出
application/json
。解组器的工作方式非常类似(同样是隐式的),因此您只需以与我提供封送器相同的方式显式提供解组器。我会在接下来的24小时内看一眼hours@SaminOakland希望这能更接近你的目标:)太棒了!非常感谢你!我花了一个小时才找到答案,最后只有你的帮助了我,谢谢!