Scala Databinder分派:获取403响应的未压缩内容
我使用databinder dispatch来发出HTTP请求,只要web服务器返回404,这种请求就可以正常工作 如果请求失败,web服务器将返回403状态代码,并在响应正文中以XML形式提供详细的错误消息 如何读取xml正文(不考虑403),例如,如何使dispatch忽略所有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
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)中,只有状态代码(代码)
存在。