2012-05-28 2 views
2

J'utilise DataBinder expédition pour faire des requêtes HTTP qui fonctionne bien, tant que le serveur Web retourne un 404.expédition DataBinder: Obtenez le contenu non compressé d'une 403 réponse

Si la requête échoue, le serveur Web renvoie une 403 code d'état et fournit un message d'erreur détaillé dans le corps de la réponse en tant que XML.

Comment lire le corps xml (indépendamment du 403), par ex. comment puis-je faire dépêche ignore toutes les erreurs 403?

Mon code ressemble à ceci:

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 
    } 
} 

Répondre

2

Je crois quelque chose comme cela fonctionne:

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

L'erreur sera gauche. Le succès sera en droit. L'erreur est une chaîne qui doit contenir la réponse XML que vous désirez.

Si vous avez besoin de plus, je crois que vous pouvez regarder HttpExecutor.x, ce qui devrait vous donner un contrôle total. Cela fait un moment que j'ai utilisé la répartition, cependant.

Aussi, je suggère d'utiliser plus val's et moins var.

+0

Le problème est que le contenu est le contenu brut gzippé. Habituellement j'utilise val dans tous les endroits où je peux. – user3001

+0

Existe-t-il un moyen de transmettre le contenu aux gestionnaires gzip et xml que j'ai définis auparavant? Ce que je veux, c'est que le contenu de l'erreur soit décompressé et analysé comme XML – user3001

+0

Je ne peux pas trouver 'StatusCode (code, contenu)' dans la dernière version de dispatch (0.11.2), il n'y a que 'StatusCode (code)' . – null

Questions connexes