我想Source在它上面创建一个和后来的推送元素,如:
val src = ... // create the Source here
// and then, do something like this
pushElement(x1, src)
pushElement(x2, src)
Run Code Online (Sandbox Code Playgroud)
建议的方法是什么?
谢谢!
我将使用Scala和Akka Actors开发新的HTTP/REST服务.
我有使用Play的经验,但我并不需要一个完整的Web框架.从我读到的,我认为Spray是一个合适的选择.在新到达的AKKA-HTTP之后,我的问题来自Spray的未来.
Spray项目是否会独立于Akka-HTTP项目而增长,还是两个项目将合并为一个Akka-HTTTP?
如果我开始用Spray开发,这有什么影响?另外我读到Play将集成AKKA-HTTP.所以我终于想知道是不是应该选择Play?
谢谢你的帮助.
我正在尝试使用Akka HTTP来基本验证我的请求.碰巧我有一个外部资源来进行身份验证,因此我必须对此资源进行休息调用.
这需要一些时间,并且在处理时,我的API的其余部分似乎被阻止,等待此调用.我用一个非常简单的例子重现了这个:
// used dispatcher:
implicit val system = ActorSystem()
implicit val executor = system.dispatcher
implicit val materializer = ActorMaterializer()
val routes =
(post & entity(as[String])) { e =>
complete {
Future{
Thread.sleep(5000)
e
}
}
} ~
(get & path(Segment)) { r =>
complete {
"get"
}
}
Run Code Online (Sandbox Code Playgroud)
如果我发布到日志端点,我的get端点也会等待5秒,这是日志端点所指示的.
这是预期的行为,如果是,如何在不阻止整个API的情况下进行阻止操作?
所以我有一个带有这个签名的函数(akka.http.model.HttpResponse):
def apply(query: Seq[(String, String)], accept: String): HttpResponse
Run Code Online (Sandbox Code Playgroud)
我只是在测试中得到一个值:
val resp = TagAPI(Seq.empty[(String, String)], api.acceptHeader)
Run Code Online (Sandbox Code Playgroud)
我想在测试中检查它的身体,例如:
resp.entity.asString == "tags"
Run Code Online (Sandbox Code Playgroud)
我的问题是如何将响应体作为字符串?
我需要记录akka http客户端请求以及他们的响应.虽然似乎有一些用于记录这些请求的API,但没有关于如何完成这些请求的明确文档.我的方法是创建一个记录的请求,透明地包装Http().singleRequest(req)如下:
def loggedRequest(req: HttpRequest)
(implicit system: ActorSystem, ctx: ExecutionContext, m: Materializer): Future[HttpResponse] = {
Http().singleRequest(req).map { resp ?
Unmarshal(resp.entity).to[String].foreach{s ?
system.log.info(req.toString)
system.log.info(resp.toString + "\n" + s)
}
resp
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我必须通过解组或通过简单的请求来获取未来resp.entity.dataBytes,以便恢复响应的主体.我得到了日志记录但是承诺已经完成,我无法再将实体解组为实际数据.一个工作的解决方案将记录请求和响应并传递此测试用例,而IllegalStateException不会抛出"Promise already completed":
describe("Logged rest requests") {
it("deliver typed responses") {
val foo = Rest.loggedRequest(Get(s"http://127.0.0.1:9000/some/path"))
val resp = foo.futureValue(patience)
resp.status shouldBe StatusCodes.OK
val res = Unmarshal(resp.entity).to[MyClass].futureValue
}
}
Run Code Online (Sandbox Code Playgroud)
想法欢迎.
在akka http上创建一个包含60+ API的REST Web服务时.如何选择是否应该选择akka流或akka演员?在他的帖子中,乔斯展示了两种在akka http上创建API的方法,但他没有显示何时我应该选择一个而不是另一个.
我在Akka-http框架(版本:10.0)上执行负载测试,我使用的是wrk工具.wrk命令:
wrk -t6 -c10000 -d 60s --timeout 10s --latency http://localhost:8080/hello
首次运行没有任何阻塞调用,
object WebServer {
implicit val system = ActorSystem("my-system")
implicit val materializer = ActorMaterializer()
implicit val executionContext = system.dispatcher
def main(args: Array[String]) {
val bindingFuture = Http().bindAndHandle(router.route, "localhost", 8080)
println(
s"Server online at http://localhost:8080/\nPress RETURN to stop...")
StdIn.readLine() // let it run until user presses return
bindingFuture
.flatMap(_.unbind()) // trigger unbinding from the port
.onComplete(_ => system.terminate()) // and shutdown when done
}
}
object router {
implicit …Run Code Online (Sandbox Code Playgroud) Akka HTTP(正式名称为Spray)的一个特性是它能够自动编组和解组从json到案例类等的数据.我已经成功地使这个工作得很好.
目前,我正在尝试创建一个使用查询参数执行GET请求的HTTP客户端.代码目前看起来像这样:
val httpResponse: Future[HttpResponse] =
Http().singleRequest(HttpRequest(
uri = s"""http://${config.getString("http.serverHost")}:${config.getInt("http.port")}/""" +
s"query?seq=${seq}" +
s"&max-mismatches=${maxMismatches}" +
s"&pam-policy=${pamPolicy}"))
Run Code Online (Sandbox Code Playgroud)
嗯,那不是那么漂亮.如果我可以传入一个包含查询参数的case类,并且让Akka HTTP自动生成查询参数,就像它对json一样.(另外,Akka HTTP的服务器端有一种解析GET查询参数的优雅方式,所以人们会认为它也会有一种优雅的方式来生成它们.)
我想做类似以下的事情:
val httpResponse: Future[HttpResponse] =
Http().singleRequest(HttpRequest(
uri = s"""http://${config.getString("http.serverHost")}:${config.getInt("http.port")}/query""",
entity = QueryParams(seq = seq, maxMismatches = maxMismatches, pamPolicy = pamPolicy)))
Run Code Online (Sandbox Code Playgroud)
只是,上述实际上并不起作用.
我想用Akka HTTP以某种方式做什么?或者我只是需要以老式的方式做事?即,显式生成查询参数,就像我在上面的第一个代码块中一样.
(我知道如果我要将其从GET更改为POST,我可能会让它更像我希望它工作,从那时起我可以从案例中自动转换POST请求的内容上课到json,但我真的不想这样做.)
Akka HTTP和Spray提供了一个authenticateOAuth2指令,但他们的文档说明了这一点
该指令不实现完整的OAuth2协议,而是通过从HTTP头中提取所需的令牌来实现它.
我也找不到任何为Akka HTTP或Spray实现OAuth2的库.有什么我想念的,或者这只是现在这些库的状态?
目的是从数据库流式传输数据,对此数据块执行一些计算(此计算返回某些案例类的Future),并将此数据作为分块响应发送给用户.目前,我能够流式传输数据并发送响应,而无需执行任何计算.但是,我无法执行此计算,然后流式传输结果.
这是我实施的路线.
def streamingDB1 =
path("streaming-db1") {
get {
val src = Source.fromPublisher(db.stream(getRds))
complete(src)
}
}
Run Code Online (Sandbox Code Playgroud)
函数getRds返回映射到case类的表的行(使用slick).现在考虑函数compute,它将每行作为输入并返回另一个案例类的Future.就像是
def compute(x: Tweet) : Future[TweetNew] = ?
Run Code Online (Sandbox Code Playgroud)
如何在变量src上实现此函数,并将此计算的分块响应(作为流)发送给用户.