【问题标题】:Get tweets from API using Akka-HTTP, Twitter4j使用 Akka-HTTP、Twitter4j 从 API 获取推文
【发布时间】:2018-01-06 03:24:31
【问题描述】:

我有通过用户 ID 获取推文的方法,为此我使用了 Twitter4J 和 Akka 流。我想以用户发送获取请求并接收一组推文的方式创建一个 API。请求如下所示: 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, expected: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 方法调用或过滤方法本身以获取一组推文作为对我的 get 请求的响应?或者更好地说如何将它们从控制台重定向到响应正文?我应该为此使用数据库吗? 任何建议表示赞赏!

【问题讨论】:

    标签: scala twitter4j akka-stream akka-http


    【解决方案1】:

    匹配onSuccess的结果:

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

    当然,您必须提供响应编组器。如果你想要一个 JSON 作为响应,你可以使用Akka HTTP JSON + Circe。只需添加这两个导入,如果您在响应类中没有一些特殊类型(例如Tweet),它应该可以工作:

    import de.heikoseeberger.akkahttpcirce.FailFastCirceSupport._
    import io.circe.generic.auto._
    

    【讨论】:

    • 我应该向 sbt 添加哪些依赖项才能使其工作?我应该创建推文实体吗?
    • @Cassie circe-generic 和 akka-http-circe。是的,您可能应该创建一个 Tweet 类或使用一些表示推文的现有实体。差不多,这个方法的一个返回类型:filterTwitterStreamByUserID
    • complete(StatusCodes.OK, tweets) 返回编译错误 StandardRoute 类型的表达式不符合预期类型 Future[RouteResult]
    • 尝试flatMap onSuccess
    • 我很抱歉提出愚蠢的问题,但是你所说的平面映射 onSuccess 是什么意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 2022-01-10
    • 2014-12-19
    相关资源
    最近更新 更多