2011-08-11 12 views
8

Tengo un código como el siguiente:Android obtener respuesta después de 403 en HttpClient

HttpClient httpClient = new DefaultHttpClient(); 
HttpPost httpPost = new HttpPost(server); 

try { 
    JSONObject params = new JSONObject(); 
    params.put("email", email); 

    StringEntity entity = new StringEntity(params.toString(), "UTF-8"); 
    httpPost.setHeader("Content-Type", "application/json;charset=UTF-8"); 
    httpPost.setEntity(entity); 

    ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
    String responseBody = httpClient.execute(httpPost, responseHandler); 
    JSONObject response = new JSONObject(responseBody); 
     fetchUserData(response); 

    saveUserInfo(); 

    return true; 
} catch (ClientProtocolException e) { 
    Log.d("Client protocol exception", e.toString()); 
    return false; 
} catch (IOException e) { 
    Log.d`enter code here`("IOEXception", e.toString()); 
    return false; 
} catch (JSONException e) { 
    Log.d("JSON exception", e.toString()); 
    return false; 
} 

Y quiero tener una respuesta aunque tenga HTTP 403 Forbidden a conocer el mensaje de error

Respuesta

12

El BasicResponseHandler solo devuelve sus datos si se devolvió un código de éxito (2xx). Sin embargo, puede escribir fácilmente su propio ResponseHandler para devolver siempre el cuerpo de la respuesta como String, p. Ej.

ResponseHandler<String> responseHandler = new ResponseHandler<String>() { 
    @Override 
    public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException { 
     return EntityUtils.toString(response.getEntity()); 
    } 
    }; 

Alternativamente, se puede utilizar el other overloaded execute method en HttpClient que no requiere un ResponseHandler y le devuelve la HttpResponse directamente. Luego llame al EntityUtils.toString(response.getEntity()) de la misma manera.

Para obtener el código de estado de una respuesta, puede usar HttpResponse.getStatusLine().getStatusCode() y compararla con una de las entradas estáticas en la clase HttpStatus. P.ej. el código '403' es HttpStatus.SC_FORBIDDEN. Puede tomar acciones particulares según sea relevante para su aplicación dependiendo del código de estado que se devuelva.

+0

¡Muchas gracias por su respuesta! – skayred

2

De acuerdo con la documentación para BasicResponseHandler:

Si la respuesta no tuvo éxito (> = 300 código de estado), emite una HttpResponseException.

Se podría atrapar a este tipo de excepción (Nota: ya que coger el supertipo de esta excepción ClientProtocolException) y se podía poner un poco de lógica personalizada en ese bloque de captura para crear/guardar algún tipo de respuesta cuando se encuentra con una situación de error , como el 403.

Cuestiones relacionadas