2013-07-29 17 views
8

我使用Spray API(噴客戶端)打內部Solr URL,我想能夠將響應解析爲Scala案例類。如果我只是期望和HTTPResponse,我得到的價值回來,但是當我嘗試將它編入我的案例類,它失敗(我不能產生一個消息以外的空(),因爲我'使用匹配,顯然沒有得到正確的測試用例。)如何解構Spray API HTTPResponse?

我認爲我的一些問題是它返回的數據形式爲text/plain而不是application/json。當我想到的HttpResponse,而不是我的案例類,

val f: Future[HttpResponse] = 
    (IO(Http) ? Get("http://1.2.3.4:8983/solr/collection1/select?q=*%3A*&wt=json")).mapTo[HttpResponse] 

我得到:

HttpResponse(200 OK,HttpEntity(text/plain; charset=UTF-8, 
{ 
    "responseHeader":{"status":0,"QTime":65,"params":{"q":"*:*","wt":"json"}}, 
    "response":{"numFound":147437873,"start":0,"maxScore":1.0,"docs": 
    [ 
     {"guid":"TLQ0jVlMYCXQrYkBIZHNXfMmifw+3","alias":["greg"],"_version_":1440942010264453120}, 
     {"guid":"TQsDY1ZG7q+Ne5e6F7qAUhFyomSH9","_version_":1440942010296958976}, 
     {"guid":"TzWB5grOBAJJZcAQDo2k9xBUVGPFr","alias":["spark"],"_version_":1440942010298007552}, 
     {"guid":"T0judCG4UI9RYqDDQVcn+gyZEU7Bb","alias":["zombie"],...),List(Connection: close, Content-Type: text/plain; charset=UTF-8),HTTP/1.1) 

但是,當我改變,要指望我的案例類,我無法比擬的。那麼,我該如何編組它返回到Scala案例類中的數據呢?這是我曾嘗試:

case class SolrParams(q: String, wt: String) 
case class SolrResponseHeader(status: String, qtime: String, params: SolrParams) 
case class SolrDoc(guid: String, alias: List[String], version: String) 
case class SolrResponse(numFound: Long, start: Long, maxScore: String, docs: List[SolrDoc]) 

case class SolrApResult(responseHeader: SolrResponseHeader, response: SolrResponse) 

object SolrJsonProtocol extends DefaultJsonProtocol { 
    implicit val paramsFormat = jsonFormat2(SolrParams) 
    implicit val responseHeaderFormat = jsonFormat2(SolrResponseHeader) 
    implicit val docFormat = jsonFormat3(SolrDoc) 
    implicit val responseFormat = jsonFormat4(SolrResponse) 
    implicit def solrApiResultFormat = jsonFormat2(SolrApiFullResult) 
} 

... 

val f: Future[SolrApiResult] = 
    (IO(Http) ? Get("http://1.2.3.4:8983/solr/collection1/select?q=*%3A*&wt=json")).mapTo[SolrApiResult] 

這使我在f onComplete ...結構不匹配。問題可能是我的案例類與返回的案例類不匹配,如果有的話,您有什麼建議可以更好地排除故障?

我一直在all over the docs,他們不是不完整或有點過時,加上我在這個遊戲是新的,所以這也沒有幫助。

回答

6

我在代碼中看到的主要問題是,您期待mapTo自動將http響應正文解組到您的案例類結構中。 mapTo方法屬於Future類,不知道json解組。您在Akka請求(其中?正在引擎蓋下)中使用mapTo,以基本上將Future[Any](這是?中的默認響應類型)「投射」到實際返回的類型中。這與json unmarshalling無關。我相信爲了達到你想要的效果,你應該爲噴霧創建一個pipeline,它將發送請求並解除響應。顯示示例的文檔是here。我想對於你的榜樣,它會是這個樣子(代碼可能不是100%正確的,只是想表明一般流程):

val pipeline = sendReceive ~> unmarshall[SolrApiResult] 
val response:Future[SolrApiResult] = pipeline(Get("http://1.2.3.4:8983/solr/collection1/select?q=*%3A*&wt=json")) 
+0

確定這是很好的瞭解 - 我沒想到'.mapTo'有它顯然沒有額外的魔法。謝謝 – jbnunn

+0

@cmbaxter,鏈接'here'現在不存在。 –

+1

@KevinMeredith,我更新了鏈接 – cmbaxter