gpt4 book ai didi

Scala 喷雾客户端为 AKKA ActorRefFactory 定义隐式

转载 作者:行者123 更新时间:2023-12-01 08:30:27 24 4
gpt4 key购买 nike

我正在尝试使用 Scala 和 spray-client 编写一个简单的 HTTP 客户端。我的客户基于 Spray docs 上给出的示例.

我的问题是该示例正在创建一个新的 implicit ActorSystem 即

implicit val system = ActorSystem()

但我希望我的客户端是可重用的,而不是创建新的 ActorSystem。

这是我的代码的要点。

trait WebClient {
def get(url: String)(implicit system: ActorSystem): Future[String]
}

object SprayWebClient extends WebClient {
val pipeline: HttpRequest => Future[HttpResponse] = sendReceive

def get(url: String): Future[String] = {
val r = pipeline (Get("http://some.url/"))
r.map(_.entity.asString)
}

}

但我收到两个关于隐式的编译器错误

implicit ActorRefFactory required: if outside of an Actor you need an implicit ActorSystem, inside of an actor this should be the implicit ActorContext WebClient.scala ...

not enough arguments for method sendReceive: (implicit refFactory: akka.actor.ActorRefFactory, implicit executionContext: scala.concurrent.ExecutionContext, implicit futureTimeout: akka.util.Timeout)spray.http.HttpRequest => scala.concurrent.Future[spray.http.HttpResponse]. Unspecified value parameters refFactory, executionContext.   WebClient.scala...

我应该如何更改 API 定义?

最佳答案

这里有一个解决方案:

import akka.actor.ActorSystem
import spray.http.{HttpRequest, HttpResponse}
import scala.concurrent.Future
import spray.client.pipelining._

trait WebClient {
def get(url: String): Future[String]
}

class SprayWebClient(implicit system: ActorSystem) extends WebClient {
import system.dispatcher

val pipeline: HttpRequest => Future[HttpResponse] = sendReceive

def get(url: String): Future[String] = {
val r = pipeline (Get("http://some.url/"))
r.map(_.entity.asString)
}
}

这是另一个保留原始 WebClient.get 签名:

import akka.actor.ActorSystem
import spray.http.{HttpRequest, HttpResponse}
import scala.concurrent.Future
import spray.client.pipelining._

trait WebClient {
def get(url: String)(implicit system: ActorSystem): Future[String]
}

object SprayWebClient extends WebClient {
def get(url: String)(implicit system: ActorSystem): Future[String] = {
import system.dispatcher

val pipeline: HttpRequest => Future[HttpResponse] = sendReceive
val r = pipeline (Get("http://some.url/"))
r.map(_.entity.asString)
}
}

第二个有点贵,因为每次都会重新创建管道,即使它在理论上每个 ActorSystem 都是静态的。我更喜欢第一个解决方案,并尝试找到一种通过您的应用程序传播 WebClient 的方法(通过使用 cake 模式、显式传递它或使用其他依赖注入(inject)技术)。

关于Scala 喷雾客户端为 AKKA ActorRefFactory 定义隐式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20443826/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com