Scala 使用Akka HTTP、Twitter4j从API获取推文
我有通过用户ID获取推文的方法,我使用了Twitter4J和Akka流。我想创建一个API,让用户发送get请求并接收一组tweet。请求如下所示: 目前,我只能获得Ok状态,但我不知道如何通过一些客户端(如邮递员)获取推文(当我发送get请求时)。因为我只在控制台上收到所有推文。我的API路径如下所示:Scala 使用Akka HTTP、Twitter4j从API获取推文,scala,twitter4j,akka-stream,akka-http,Scala,Twitter4j,Akka Stream,Akka Http,我有通过用户ID获取推文的方法,我使用了Twitter4J和Akka流。我想创建一个API,让用户发送get请求并接收一组tweet。请求如下所示: 目前,我只能获得Ok状态,但我不知道如何通过一些客户端(如邮递员)获取推文(当我发送get请求时)。因为我只在控制台上收到所有推文。我的API路径如下所示: trait ApiRoute extends Databases { val twitterStream = TwitterStreamFilters.configureTwitterS
trait ApiRoute extends Databases {
val twitterStream = TwitterStreamFilters.configureTwitterStream()
val counter = new Counter
twitterStream.addListener(counter)
val routes = pathPrefix("tweets") {
pathSingleSlash {
complete("hello")
}
} ~
pathPrefix("tweets") {
pathPrefix(LongNumber) {
userId =>
get {
onSuccess(Future.successful(TwitterStreamFilters.filterTwitterStreamByUserID(twitterStream, Array(userId)))) {
complete(StatusCodes.OK)
}
}
}
}
}
但我想把它改成这样,。但是当我写这篇文章时,我得到了类型不匹配,预期:ToResponseMarshallable,实际:RequestContext编译错误:
onSuccess(Future.successful(TwitterStreamFilters.filterTwitterStreamByUserID(twitterStream, Array(userId)))) {
result => complete(result)
}
这是过滤推文的方法:
def filterTwitterStreamByUserID(twitterStream: TwitterStream, userId: Array[Long]) = {
twitterStream.filter(new FilterQuery().follow(userId))
}
以下是我获取推文流的代码:
class Counter extends StatusAdapter{
implicit val system = ActorSystem("EmojiTrends")
implicit val materializer = ActorMaterializer()
implicit val executionContext = system.dispatcher
implicit val LoggingAdapter =
Logging(system, classOf[Counter])
val overflowStrategy = OverflowStrategy.backpressure
val bufferSize = 1000
val statusSource = Source.queue[Status](
bufferSize,
overflowStrategy
)
val sink: Sink[Any, Future[Done]] = Sink.foreach(println)
val flow: Flow[Status, String, NotUsed] = Flow[Status].map(status => status.getText)
val graph = statusSource via flow to sink
val queue = graph.run()
override def onStatus(status: Status) =
Await.result(queue.offer(status), Duration.Inf)
}
那么,我如何更改API方法调用或过滤方法本身以获取一组tweet作为对get请求的响应呢?或者更好地说,如何将它们从控制台重定向到响应体?我应该使用数据库吗?
任何建议都将不胜感激 匹配成功时的
结果
:
onSuccess(Future.successful(TwitterStreamFilters.filterTwitterStreamByUserID(twitterStream, Array(userId)))) {
case tweets: Set[Tweet] => complete(StatusCodes.OK, tweets)
}
当然,您必须提供响应封送员。如果希望将JSON作为响应,可以使用+Circe。只需添加这两个导入,如果响应类中没有一些特殊类型(例如,Tweet
),它应该可以工作:
我应该向sbt添加哪些依赖项以使其工作?我应该创建Tweet实体吗?@Cassie circe和generic。是的,也许你应该创建一个Tweet类或者使用一些表示Tweet的现有实体。基本上,这种方法的返回类型:
filterWitterStreamBySerid
complete(StatusCodes.OK,tweets)返回类型为StandardRoute的编译错误表达式不符合预期类型Future[RouterResult]尝试flatMap
成功
。很抱歉问了一些愚蠢的问题,但是你所说的成功的平面映射是什么意思呢?
import de.heikoseeberger.akkahttpcirce.FailFastCirceSupport._
import io.circe.generic.auto._