Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何解构Spray API HTTPResponse?_Scala_Solr_Akka_Spray - Fatal编程技术网

Scala 如何解构Spray API HTTPResponse?

Scala 如何解构Spray API HTTPResponse?,scala,solr,akka,spray,Scala,Solr,Akka,Spray,我使用Spray API(Spray client)来访问内部Solr URL,我希望能够将响应解析为Scala case类 如果我只是expect和HTTPResponse,我会得到一个值,但是当我尝试将它封送到我的case类中时,它失败了(我不能生成null()以外的消息,因为我使用的是匹配,显然没有得到正确的测试用例) 我认为我的一些问题是它以text/plain的形式返回数据,而不是application/json。当我期望HttpResponse而不是我的case类 val f: Fu

我使用Spray API(Spray client)来访问内部Solr URL,我希望能够将响应解析为Scala case类

如果我只是expect和HTTPResponse,我会得到一个值,但是当我尝试将它封送到我的case类中时,它失败了(我不能生成null()以外的消息,因为我使用的是匹配,显然没有得到正确的测试用例)

我认为我的一些问题是它以
text/plain
的形式返回数据,而不是
application/json
。当我期望HttpResponse而不是我的case类

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类中呢?以下是我尝试过的:

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…
结构中没有匹配项。问题可能是我的案例类与返回的内容不匹配,如果是,您有什么建议可以更好地解决问题


我一直是,他们要么不完整,要么有点过时,加上我是这个游戏的新手,所以这也没有帮助。

我看到您的代码的主要问题是,您希望
mapTo
自动将http响应主体解组到您的案例类结构中。
mapTo
方法属于
Future
类,不知道json解组。在Akka请求中使用
mapTo
(这是
在引擎盖下执行的操作),基本上将
未来的[Any]
(这是
中的默认响应类型)转换为实际返回的类型。这与json解组无关。我相信为了实现您想要的,您应该为spray创建一个
管道
,该管道将发送请求并解组响应。显示该示例的文档如下所示。我认为对于您的示例,它看起来是这样的(代码可能不是100%正确,只是试图显示一般流程):


好的,很高兴知道——我确实认为
.mapTo
有额外的魔力,但它显然没有。感谢you@cmbaxter,此处链接的
现在不存在。
val pipeline = sendReceive ~> unmarshall[SolrApiResult]
val response:Future[SolrApiResult] = pipeline(Get("http://1.2.3.4:8983/solr/collection1/select?q=*%3A*&wt=json"))