Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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 Databinder分派:获取403响应的未压缩内容_Scala_Scala Dispatch - Fatal编程技术网

Scala Databinder分派:获取403响应的未压缩内容

Scala Databinder分派:获取403响应的未压缩内容,scala,scala-dispatch,Scala,Scala Dispatch,我使用databinder dispatch来发出HTTP请求,只要web服务器返回404,这种请求就可以正常工作 如果请求失败,web服务器将返回403状态代码,并在响应正文中以XML形式提供详细的错误消息 如何读取xml正文(不考虑403),例如,如何使dispatch忽略所有403错误 我的代码如下所示: class HttpApiService(val apiAccount:ApiAccount) extends ApiService { val http = new Http

我使用databinder dispatch来发出HTTP请求,只要web服务器返回404,这种请求就可以正常工作

如果请求失败,web服务器将返回403状态代码,并在响应正文中以XML形式提供详细的错误消息

如何读取xml正文(不考虑403),例如,如何使dispatch忽略所有403错误

我的代码如下所示:

class HttpApiService(val apiAccount:ApiAccount) extends ApiService {
  val http = new Http

  override def baseUrl() = "http://ws.audioscrobbler.com/2.0"

  def service(call:Call) : Response = {
    val http = new Http
    var req = url(baseUrl())
    var params = call.getParameterMap(apiAccount)

    var response: NodeSeq = Text("")

    var request: Request = constructRequest(call, req, params)
    // Here a StatusCode exception is thrown. 
    // Cannot use StatusCode case matching because of GZIP compression
    http(request <> {response = _})
    //returns the parsed xml response as NodeSeq
    Response(response)
  }

  private def constructRequest(call: Call, req: Request, params: Map[String, String]): Request = {
    val request: Request = call match {
      case authCall: AuthenticatedCall =>
        if (authCall.isWriteRequest) req <<< params else req <<? params
      case _ => req <<? params
    }
    //Enable gzip compression
    request.gzip
  }
}
class-HttpApiService(val-apicount:apicount)扩展了ApiService{
val http=新的http
覆盖def baseUrl()http://ws.audioscrobbler.com/2.0"
def服务(呼叫:呼叫):响应={
val http=新的http
var req=url(baseUrl())
var params=call.getParameterMap(APICount)
变量响应:NodeSeq=Text(“”)
var请求:请求=构造请求(调用、请求、参数)
//这里抛出一个状态码异常。
//由于GZIP压缩,无法使用StatusCode大小写匹配
http(请求{response=})
//将解析后的xml响应作为NodeSeq返回
回应(回应)
}
私有def constructRequest(call:call,req:Request,params:Map[String,String]):请求={
val请求:请求=呼叫匹配{
案例authCall:AuthenticatedCall=>
如果(authCall.isWriteRequest)req我相信这样的方法是有效的:

val response: Either[String, xml.Elem] = 
  try { 
    Right(http(request <> { r => r })) 
  } catch { 
    case dispatch.StatusCode(403, contents) => 
      Left(contents)
  }
val响应:要么[String,xml.Elem]=
试试{
右(http(请求{r=>r}))
}捕获{
案例发送。状态代码(403,内容)=>
左(目录)
}
错误将出现在左侧。成功将出现在右侧。错误是一个字符串,应该包含所需的XML响应

如果您需要更多,我相信您可以查看HttpExecutor.x,它应该会给您完全的控制权。不过,我已经有一段时间没有使用dispatch了


另外,我建议使用更多的val,而使用更少的var。

问题是内容是原始的gzip内容。通常我在所有可以使用val的地方都使用val。有没有办法将内容传递给我以前定义的gzip和xml处理程序?我想要的是将错误内容解压缩并解析为XMLI找不到
StatusCode(代码,目录)
在最新的调度版本(0.11.2)中,只有
状态代码(代码)
存在。