2017-09-07 17 views
0

私は次のエラーを取得しています、なぜ誰も私に言うことができる?:アッカのHttpクライアント型の不一致

[error] HttpClient.scala:117: type mismatch; 
[error] found : akka.stream.scaladsl.Sink[(akka.http.scaladsl.model.StatusCode, String),scala.concurrent.Future[(akka.http.scaladsl.model.StatusCode, String)]] 
[error] required: akka.stream.Graph[akka.stream.SinkShape[(akka.http.scaladsl.model.StatusCode, String)],scala.concurrent.Future[akka.http.scaladsl.model.StatusCode]] 
[error]  source.via(flow).runWith(Sink.head) 
[error]         ^

をここではコードです:

implicit def map2entity: ToEntityMarshaller[Map[String, Any]] = mapMarshaller(MediaTypes.`application/json`) 

def mapMarshaller(mediaType: MediaType.WithFixedCharset): ToEntityMarshaller[Map[String, Any]] = 
    Marshaller.withFixedContentType(mediaType) { m => HttpEntity(mediaType, JSONObject(m).toString()) } 

def post(path: String, entity: Map[String, Any]): Future[StatusCode] = { 
    val uri = Uri(getResourceUri(path)) 
    logger.info(s"httpPost: $uri") 
    Marshal(entity).to[RequestEntity] flatMap { e => 
    val source = Source.single(HttpRequest(
     uri = uri.path.toString, 
     method = HttpMethods.POST, 
     entity = e)) 

    val flow = getConnection(uri.scheme)(uri.authority.host.address) 
     .mapAsync(10) { r => 
     //(r.status -> Marshal(r.entity).to[String]) 
     Unmarshal(r.entity).to[String].flatMap(s => Future(r.status -> s)) 
     } 

    source.via(flow).runWith(Sink.head) 
    } 
} 

答えて

0

あなたのシンクのマテリアライズド値(Future[(StatusCode, String)])であるが、 (Future[StatusCode])で宣言した戻り値の型とは異なります。 ...だから私は変更P:post機能のみステータスコードを返す必要があるあなたの場合は

は、あなたがこのコール

.map(_ => r.status) 
+1

は、戻り値の型を変更することを忘れてしまった。これに

.flatMap(s => Future(r.status -> s)) 

を変更することができます'Future [(StatusCode、String)]'関数の戻り値の型です。それは長いカップルの日だった –