2011-08-11 12 views
8

mam kod jak poniżej:Android uzyskanie odpowiedzi po 403 w 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; 
} 

i chcę mieć odpowiedź, nawet jeśli mam HTTP 403 Forbidden dostać komunikat o błędzie

Odpowiedz

12

Zwraca tylko twoje dane, jeśli został zwrócony kod sukcesu (2xx). Można jednak z łatwością napisać własną wersję ResponseHandler, aby zawsze zwracać treść odpowiedzi jako String, np.

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

Alternatywnie, można użyć other overloaded execute method na HttpClient który nie wymaga ResponseHandler i zwraca Ci HttpResponse bezpośrednio. Następnie zadzwoń pod numer EntityUtils.toString(response.getEntity()) w ten sam sposób.

Aby uzyskać kod stanu odpowiedzi, można użyć HttpResponse.getStatusLine().getStatusCode() i porównać z jednym ze statycznych adresów w klasie HttpStatus. Na przykład. kod "403" to HttpStatus.SC_FORBIDDEN. Możesz podjąć określone działania w zależności od aplikacji, w zależności od zwróconego kodu statusu.

+0

Wielkie dzięki za odpowiedź! – skayred

2

Zgodnie z dokumentacją dla BasicResponseHandler:

Jeśli odpowiedź była nieudana (> = 300 kodem stanu), zgłasza HttpResponseException.

Można złapać ten typ wyjątku (UWAGA: jesteś już łapanie supertypem tego wyjątku ClientProtocolException) i można umieścić jakąś niestandardową logikę w tym bloku catch, aby utworzyć/zapisać jakąś odpowiedź, jeśli wystąpi sytuacja błędzie , np. 403.