2016-11-20 179 views
0

我想在akka-http中編寫一個輪詢客戶端,將所有響應主體轉換爲Play JsObject。我到目前爲止是編碼如下,使用this library這應該使事情變得簡單(我認爲?)。然而,當我嘗試下面我收到以下錯誤運行該代碼:在akka-http客戶端中使用PlayJson

Error:(26, 56) type mismatch; 
found : akka.http.scaladsl.unmarshalling.FromEntityUnmarshaller[play.api.libs.json.JsObject] 
    (which expands to) akka.http.scaladsl.unmarshalling.Unmarshaller[akka.http.scaladsl.model.HttpEntity,play.api.libs.json.JsObject] 
required: akka.http.scaladsl.unmarshalling.Unmarshaller[akka.http.scaladsl.model.HttpResponse,play.api.libs.json.JsObject] 
    Unmarshaller.byteStringUnmarshaller.mapWithCharset { (data, charset) => 

什麼我需要改變,以獲得按預期工作的事情嗎?

import java.util.UUID 

import akka.actor.ActorSystem 
import akka.http.scaladsl.Http 
import akka.http.scaladsl.model.{HttpEntity, HttpRequest, HttpResponse} 
import akka.stream.ActorMaterializer 
import akka.stream.scaladsl.Source 
import akka.http.scaladsl.unmarshalling.{Unmarshal, Unmarshaller} 
import de.heikoseeberger.akkahttpplayjson.PlayJsonSupport._ 
import play.api.libs.json.{JsObject, Json} 

import scala.concurrent.duration._ 
import scala.util.{Success, Try} 


object Main extends App { 

    implicit val system = ActorSystem("TestSys") 
    implicit val ec = system.dispatcher 
    implicit val materializer = ActorMaterializer() 

    implicit val um:Unmarshaller[HttpResponse, JsObject] = { 
    Unmarshaller.byteStringUnmarshaller.mapWithCharset { (data, charset) => 
     Json.parse(data.toArray).as[JsObject] 
    } 
    } 

    val request = HttpRequest(uri="https://www.google.com/finance/info?q=INDEXDB%3ADAX") -> UUID.randomUUID() 
    val pool = Http().superPool[UUID]() 
    val googleFinanceFlow = 
    Source.tick(0 milliseconds,10000 milliseconds,request) 
     .via(pool) 
    .runForeach { 
     case (Success(response),_) => 
     val json = Unmarshal(response).to[JsObject] 
     println(json.onSuccess{case r => println(r.toString())}) 
     case _ => Json.obj() 
    } 
} 

回答

0

只需刪除Unmarshaller[HttpResponse, JsObject]的顯式隱式(哇,這聽起來不錯,eh?)定義。這不是必需的,因爲PlayJsonSupport提供了合適的解組器。