使用Akka-HTTP,Twitter4j从API获取推文

时间:2018-01-05 13:39:39

标签: scala twitter4j akka-stream akka-http

我有通过userid获取推文的方法,我使用了Twitter4J和Akka流。我想以这样的方式创建API,即用户发送get请求并接收一组推文。请求看起来像这样: http://localhost:8080/tweets/534563976

目前,我只能获得Ok状态,但我不知道如何通过像Postman这样的客户端获取推文(当我发送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)
            }
          }
      }
    }
}

但是我想把它改成这样的东西。但是当我写这个时,我得到 TypeMismatch,期望:ToResponseMarshallable,actual: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方法调用或过滤方法本身来获取一组推文作为对我的获取请求的响应?或者更好地说明如何将它们从控制台重定向到响应主体?我应该使用数据库吗? 任何建议表示赞赏!

1 个答案:

答案 0 :(得分:1)

匹配onSuccess(Future.successful(TwitterStreamFilters.filterTwitterStreamByUserID(twitterStream, Array(userId)))) { case tweets: Set[Tweet] => complete(StatusCodes.OK, tweets) } 的结果:

Tweet

当然,您必须提供响应编组。如果您希望将JSON作为响应,则可以使用Akka HTTP JSON + Circe。只需添加这两个导入,如果您在响应类中没有一些特殊类型(例如import de.heikoseeberger.akkahttpcirce.FailFastCirceSupport._ import io.circe.generic.auto._ ),它就应该有效:

net.Dial