Scala 使用Akka HTTP、Twitter4j从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

我有通过用户ID获取推文的方法,我使用了Twitter4J和Akka流。我想创建一个API,让用户发送get请求并接收一组tweet。请求如下所示:

目前,我只能获得Ok状态,但我不知道如何通过一些客户端(如邮递员)获取推文(当我发送get请求时)。因为我只在控制台上收到所有推文。我的API路径如下所示:

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._