首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >akka HttpResponse以字符串缩放方式读取正文

akka HttpResponse以字符串缩放方式读取正文
EN

Stack Overflow用户
提问于 2015-09-01 00:28:44
回答 7查看 30.2K关注 0票数 36

所以我有一个带有这个签名的函数(akka.http.model.HttpResponse):

代码语言:javascript
复制
def apply(query: Seq[(String, String)], accept: String): HttpResponse

我只是在测试中获得一个值,如下所示:

代码语言:javascript
复制
val resp = TagAPI(Seq.empty[(String, String)], api.acceptHeader)

我想在下面这样的测试中检查它的主体:

代码语言:javascript
复制
resp.entity.asString == "tags"

我的问题是如何获得字符串形式的响应体?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2016-04-11 04:03:14

代码语言:javascript
复制
import akka.http.scaladsl.unmarshalling.Unmarshal

implicit val system = ActorSystem("System")  
implicit val materializer = ActorFlowMaterializer() 

val responseAsString: Future[String] = Unmarshal(entity).to[String]
票数 38
EN

Stack Overflow用户

发布于 2015-09-01 16:47:21

由于Akka Http是基于流的,因此实体也是流的。如果您确实需要一次使用整个字符串,可以将传入的请求转换为Strict请求:

这是通过使用toStrict(timeout: FiniteDuration)(mat: Materializer)接口在给定的时间限制内将请求收集到一个严格的实体中来完成的(这一点很重要,因为您不想在传入请求实际上永远不会结束的情况下“尝试永远收集实体”):

代码语言:javascript
复制
import akka.stream.ActorFlowMaterializer
import akka.actor.ActorSystem

implicit val system = ActorSystem("Sys") // your actor system, only 1 per app
implicit val materializer = ActorFlowMaterializer() // you must provide a materializer

import system.dispatcher
import scala.concurrent.duration._
val timeout = 300.millis

val bs: Future[ByteString] = entity.toStrict(timeout).map { _.data }
val s: Future[String] = bs.map(_.utf8String) // if you indeed need a `String`
票数 30
EN

Stack Overflow用户

发布于 2017-07-27 11:15:48

你也可以试试这个。

代码语言:javascript
复制
responseObject.entity.dataBytes.runFold(ByteString(""))(_ ++ _).map(_.utf8String) map println
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32315789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档