json – 如何将akka http请求实体unmarshall作为字符串?

前端之家收集整理的这篇文章主要介绍了json – 如何将akka http请求实体unmarshall作为字符串?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图将请求负载解析为字符串,但由于某种原因,它是失败的.我的代码
path("mypath") {

  post {
    decodeRequest {
      entity(as[String]) {jsonStr => //could not find implicit value for...FromRequestUnmarshaller[String]
        complete {
          val json: JsObject = Json.parse(jsonStr).as[JsObject]
          val jsObjectFuture: Future[JsObject] = MyDatabase.addListItem(json)
          jsObjectFuture.map(_.as[String])
        }
      }          
    }
  }
}

在这个SO thread中,例如,似乎默认情况下这个隐含的可用.但是也许这在akka-http中是不同的?

我尝试导入akka.http.scaladsl.unmarshalling.PredefinedFromEntityUnmarshallers,它具有一个stringUnmarshaller,但没有帮助.也许因为这样返回类型FromEntityUnmarshaller [String]不是FromRequestUnmarshaller [String].在spray.httpx.unmarshalling.BasicUnmarshallers中还有一个字符串解组器,但这也没有帮助,既不是akka.http.scaladsl.unmarshalling.PredefinedFromStringUnmarshallers

我如何解组(和编组)成一个字符串?

(Bonus:如何在JsObject(播放json)中直接解组,但也只有字符串,因为我有兴趣为什么这不工作,它可能对其他情况有用).

使用1.0-RC3

谢谢.

解决方法

您的代码应该是可以的,只要你有适当的范围.如果您在范围内有一个隐式FlowMaterializer,那么事情应该像编译显示代码一样工作:
import akka.http.scaladsl.server.Route
import akka.actor.ActorSystem
import akka.stream.ActorFlowMaterializer
import akka.http.scaladsl.model.StatusCodes._
import akka.http.scaladsl.server.Directives._
import akka.stream.FlowMaterializer

implicit val system = ActorSystem("test")
implicit val mater = ActorFlowMaterializer()

val routes:Route = {
  post{
    decodeRequest{
      entity(as[String]){ str =>
        complete(OK,str) 
      }
    }
  }    
}

如果你想要进一步的进一步解决一个JsObject,那么你只需要一个隐含的Unmarshaller在范围内来处理这个转换,就像这样:

implicit val system = ActorSystem("test")
implicit val mater = ActorFlowMaterializer()

import akka.http.scaladsl.unmarshalling.Unmarshaller
import akka.http.scaladsl.model.HttpEntity

implicit val um:Unmarshaller[HttpEntity,JsObject] = {
  Unmarshaller.byteStringUnmarshaller.mapWithCharset { (data,charset) =>
    Json.parse(data.toArray).as[JsObject]
  }    
}  

val routes:Route = {
  post{
    decodeRequest{
      entity(as[String]){ str =>
        complete(OK,str) 
      }
    }
  } ~
  (post & path("/foo/baz") & entity(as[JsObject])){ baz =>
    complete(OK,baz.toString)
  }    
}
原文链接:https://www.f2er.com/js/150229.html

猜你在找的JavaScript相关文章