我正在使用 Spray API(spray-client)来访问内部 Solr URL,我希望能够将响应解析为 Scala 案例类。
如果我只是期望和 HTTPResponse,我会得到一个值,但是当我尝试将它编组到我的案例类中时,它会失败(我不能产生除 null() 之外的消息,因为我正在使用匹配和显然没有得到正确的测试用例。)
我认为我的一些问题是它以的形式返回数据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 ...
这让我在结构中无法匹配。问题可能是我的案例类与返回的内容不匹配,如果是这样,您有什么建议可以更好地解决它?
我一直在研究文档,它们要么不完整,要么有点过时,而且我是这个游戏的新手,所以这也无济于事。