2

我正在使用数据绑定器调度发出 HTTP 请求,只要 Web 服务器返回 404,它就可以很好地工作。

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

如何读取 xml 正文(不考虑 403),例如如何让调度忽略所有 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
  }
}
4

1 回答 1

2

相信这样的事情是有效的:

val response: Either[String, xml.Elem] = 
  try { 
    Right(http(request <> { r => r })) 
  } catch { 
    case dispatch.StatusCode(403, contents) => 
      Left(contents)
  }

错误将在左侧。成功将是正确的。错误是一个应包含所需 XML 响应的字符串。

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

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

于 2012-05-29T01:03:33.607 回答