scala - http4s - 以 String 或 InputStream 形式获取请求正文

标签 scala scalaz-stream http4s

我正在尝试定义 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.bodyreq.bodyAsText ?

我知道json4s还有StringInputStreamInput继承自 JsonInputString 一起使用和 InputStream所以我认为我需要转换 req.bodyInputStreamreq.bodyAsTextString但我还是不明白怎么办。

我是 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/

相关文章:

java - 构建 API 蜘蛛,多少线程太多?每秒请求数的想法?

scala - 在 scalaz-streams 中记录和忽略来自 Task 的异常

Scala:http4s 对于在curl/requests 中工作的相同请求给出 401 Unauthorized

scala - Http4s解码器如何自定义无效字段的错误消息

scala - 如何优雅地关闭http4s

scala - 如何从 Play 中的请求中获取 InputStream

scala - Scala 中的函数与方法

scala - 在 Scala 中使用 actor 时如何限制并发?

scalaz-stream:如何以与其余部分不同的方式处理 "header"(第一 block )?