我正在尝试定义 HttpService
接收 json 并将其解析为带有 json4s
的案例类图书馆:
import org.http4s._
import org.http4s.dsl._
import org.json4s._
import org.json4s.native.JsonMethods._
case class Request(firstName: String, secondName: String)
HttpService {
case req @ POST -> Root =>
val request = parse(<map req.body or req.bodyAsText to JsonInput>).extract[Request]
Ok()
}
我怎样才能得到
org.json4s.JsonInput
来自 req.body
或 req.bodyAsText
?我知道
json4s
还有StringInput
和 StreamInput
继承自 JsonInput
与 String
一起使用和 InputStream
所以我认为我需要转换 req.body
至 InputStream
或 req.bodyAsText
至 String
但我还是不明白怎么办。我是 Scala 的新手,我还没有完全理解一些概念,例如
scalaz.stream.Process
.
最佳答案
彼得的解决方案既纠正了问题又回答了它,但我在这里偶然发现了 OP 提出但不是有意的问题的解决方案:“如何将请求正文作为 [...] InputStream” in http4s
.感谢 Issue 634 中的讨论在 GitHub 上,这是我想出的:
import java.io.InputStream
import org.http4s._
implicit val inputStreamDecoder: EntityDecoder[InputStream] =
EntityDecoder.decodeBy(MediaRange.`*/*`) { msg =>
DecodeResult.success(scalaz.stream.io.toInputStream(msg.body))
}
然后在您的 HttpService 中,像这样使用该解码器:
request.as[InputStream].flatMap { inputStream => ...inputStream is an InputStream... }
或者跳过整个解码器舞蹈,如果你想:
val inputStream = scalaz.stream.io.toInputStream(request.body)
关于scala - http4s - 以 String 或 InputStream 形式获取请求正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37037285/