Android получает ответ после 403 в HttpClient - PullRequest
9 голосов
/ 11 августа 2011

У меня есть такой код:

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

И я хочу получить ответ, даже если у меня HTTP 403 Запрещено получать сообщение об ошибке

Ответы [ 2 ]

13 голосов
/ 11 августа 2011

BasicResponseHandler возвращает ваши данные только в том случае, если был возвращен код успеха (2xx). Однако вы можете очень легко написать свой собственный ResponseHandler, чтобы всегда возвращать тело ответа в виде String, например

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

В качестве альтернативы вы можете использовать другой перегруженный метод выполнения для HttpClient, который не требует ResponseHandler и возвращает вам HttpResponse напрямую. Затем позвоните EntityUtils.toString(response.getEntity()) таким же образом.

Чтобы получить код состояния ответа, вы можете использовать HttpResponse.getStatusLine().getStatusCode() и сравнить с одним из статических целых чисел в классе HttpStatus. Например. код «403» равен HttpStatus.SC_FORBIDDEN. Вы можете выполнять определенные действия в зависимости от вашего приложения в зависимости от возвращенного кода состояния.

2 голосов
/ 11 августа 2011

Согласно документации для BasicResponseHandler :

Если ответ был неудачным (> = 300 код состояния), выдается HttpResponseException.

Вы можете перехватить этот тип исключения (Примечание: вы уже перехватываете супертип этого исключения ClientProtocolException), и вы можете поместить некоторую пользовательскую логику в этот блок перехвата, чтобы создать / сохранить ответ при возникновении ошибки такие как 403.

...