2011-08-11 20 views
8

Tôi có một mã như thế này:Android nhận được phản ứng sau 403 trong 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; 
} 

Và tôi muốn có một phản ứng ngay cả khi tôi có HTTP 403 Forbidden để có được thông báo lỗi

Trả lời

12

BasicResponseHandler chỉ trả lại dữ liệu của bạn nếu mã thành công (2xx) được trả lại. Tuy nhiên, bạn có thể dễ dàng viết ResponseHandler của riêng mình để luôn trả về phần thân của phản hồi dưới dạng String, ví dụ:

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

Ngoài ra, bạn có thể sử dụng other overloaded execute method trên HttpClient mà không đòi hỏi một ResponseHandler và trả về cho bạn những HttpResponse trực tiếp. Sau đó, gọi EntityUtils.toString(response.getEntity()) theo cách tương tự.

Để nhận mã trạng thái của phản hồi, bạn có thể sử dụng HttpResponse.getStatusLine().getStatusCode() và so sánh với một trong các int tĩnh trong lớp HttpStatus. Ví dụ. mã '403' là HttpStatus.SC_FORBIDDEN. Bạn có thể thực hiện các hành động cụ thể liên quan đến ứng dụng của mình tùy thuộc vào mã trạng thái được trả lại.

+0

Cảm ơn rất nhiều câu trả lời của bạn! – skayred

2

Theo tài liệu cho BasicResponseHandler:

Nếu phản hồi không thành công (> = 300 mã trạng thái), hãy ném HttpResponseException.

Bạn có thể bắt loại ngoại lệ này (Ghi chú: bạn đã bắt siêu loại ngoại lệ này ClientProtocolException) và bạn có thể đặt một số logic tùy chỉnh trong khối catch đó để tạo/lưu một số phản hồi khi gặp phải tình huống lỗi , chẳng hạn như 403.

Các vấn đề liên quan