[英]Basic akka http client post not working
我正在嘗試使一個基本的http客戶端使用Akka HTTP將一些數據發布到REST API,但無法使以下代碼正常工作:
def sendData(e : GenericEvent): Future[Either[(String,StatusCode),(GenericEvent,StatusCode)]] = {
val request = Marshal(e).to[RequestEntity]
val responseFuture: Future[HttpResponse] = request map { req =>
Source.single(HttpRequest(method = HttpMethods.POST, uri = s"/data-ingest", headers = List(auth), entity = req))
.via(dataIngestFlow)
.runWith(Sink.head)
}
responseFuture.flatMap { response =>
response.status match {
case OK => Unmarshal(response.entity).to[GenericEvent].map(Right(_, response.status))
case BadRequest => Future.successful(Left(s"$e.data: incorrect data", response.status))
case _ => Unmarshal(response.entity).to[String].flatMap { entity =>
val error = s"generic event ingest failed with status code ${response.status} and entity $entity"
logger.error(error)
Future.failed(new IOException(error))
}
}
}
我收到以下錯誤
polymorphic expression cannot be instantiated to expected type;
[error] found :
[T]akka.stream.scaladsl.Sink[T,scala.concurrent.Future[T]]
[error] required:
akka.stream.Graph[akka.stream.SinkShape[akka.http.scaladsl.model.HttpResponse],akka.http.scaladsl.model.HttpResponse]
[error] .runWith(Sink.head)
這是dataIngestFlow的代碼
val dataIngestFlow = Http().outgoingConnection(config.endpointUrl,config.endpointPort)
這是服務器端的代碼:
val routes = {
logRequestResult("akka-http-microservice") {
path("event-ingest") {
post {
entity(as[GenericEvent]) { eventIngest =>
log.info(s"Ingesting {} and publishing event to Kafka topic {}.", eventIngest.eventType,config.kafkaTopic)
kafka ! eventIngest
complete {
eventIngest
}
}~
entity(as[List[GenericEvent]]) { eventIngestList =>
eventIngestList.foreach{ eventIngest=>
log.info(s"Ingesting {} and publishing event List to Kafka topic {}.", eventIngest.eventType,config.kafkaTopic)
kafka ! eventIngest
}
complete {
eventIngestList
}
}
}
}
}
}
我嘗試了另一個簡單的客戶端,該客戶端構建良好,但是在160個事件之后攝取停止,服務器不再接收任何事件。
我在您的示例中看到的第一個問題是RequestEntity
沒有映射功能。 因此,以下行
val responseFuture: Future[HttpResponse] = request map { ...
不應該編譯。
此外,如果request
實際上是一個Future(我從地圖上推斷出),則responseFuture
實際上是Future[Future[HttpResponse]]
因為該流具體化為它自己的Future。 要解決此問題,可以使用Future.flatMap
代替map。 即:
val responseFuture: Future[HttpResponse] = request flatMap { req =>
這是期貨中的單價綁定操作 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.