2009-09-29 12 views
8

Tôi đang sử dụng Apache HttpComponents Client để POST tới máy chủ trả về JSON. Vấn đề là nếu máy chủ trả về một lỗi 400, tôi dường như không có cách nào để nói những gì lỗi là từ Java (đã phải nghỉ mát đến một gói sniffer cho đến nay - vô lý). Đây là mã:Làm cách nào để có được lỗi thực tế đằng sau HttpResponseException?

HttpClient httpclient = new DefaultHttpClient(); 
params.add(new BasicNameValuePair("format", "json")); 
params.add(new BasicNameValuePair("foo", bar)); 

HttpPost httppost = new HttpPost(uri); 
// this is how you set the body of the POST request 
httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); 

String responseBody = ""; 
try { 
    // Create a response handler 
    ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
    responseBody = httpclient.execute(httppost, responseHandler); 
} catch(HttpResponseException e) { 
    String error = "unknown error"; 
    if (e.getStatusCode() == 400) { 
     // TODO responseBody and e.detailMessage are null here, 
     // even though packet sniffing may reveal a response like 
     // Transfer-Encoding: chunked 
     // Content-Type: application/json 
     // 
     // 42 
     // {"error": "You do not have permissions for this operation."} 
     error = new JSONObject(responseBody).getString("error"); // won't work 
     } 
    // e.getMessage() is "" 
} 

Tôi đang làm gì sai? Phải có một cách dễ dàng để nhận được thông báo lỗi 400. Đây là tiểu học.

Trả lời

12

Tại sao bạn sử dụng BasicResponseHandler()? Người xử lý đang làm điều đó cho bạn. Trình xử lý đó chỉ là một ví dụ và không nên được sử dụng trong mã thực.

Bạn nên viết trình xử lý của riêng bạn hoặc gọi thực thi mà không cần trình xử lý.

Ví dụ,

 HttpResponse response = httpClient.execute(request); 
     int statusCode = response.getStatusLine().getStatusCode(); 
     HttpEntity entity = response.getEntity(); 
     responseBody = entity.getContent(); 

     if (statusCode != 200) { 
      // responseBody will have the error response 
     } 
+0

cảm ơn. Tất cả những gì còn lại là để slurp responseBody InputStream thành một String. –

+1

Bạn có thể sử dụng EntityUtils.toString (thực thể) để chuyển đổi nó thành chuỗi. Nó xử lý chuyển đổi char cho bạn. BTW, lỗi JSON phải được trả lại bằng 200. Nếu không, bạn không thể nhận phản hồi từ trình duyệt. –

+0

vui lòng trợ giúp tại đây - http://stackoverflow.com/questions/1490341/how-can-i-get-the-actual-error-behind-httpresponseexception –

1

câu trả lờiBody sẽ luôn là null nếu một ngoại lệ được ném trong khi gán giá trị cho nó.

bên cạnh đó là hành vi cụ thể của việc triển khai - tức là Apache HttpClient.

Dường như nó không duy trì bất kỳ thông tin chi tiết nào trong ngoại lệ (hiển nhiên).

Tôi sẽ tải mã nguồn cho HttpClient và gỡ lỗi đó.

nhưng trước tiên hãy kiểm tra xem có điều gì trong e.getCause() ...

hy vọng điều đó sẽ hữu ích.

+0

nhớ, đó là mã nguồn mở - bạn luôn có thể thay đổi nó hoặc đóng góp nếu bạn cần. – pstanton

+0

e.getCause() trả về giá trị rỗng. Tôi biết đó là nguồn mở nhưng tôi là người mới bắt đầu sử dụng Java và đây là chức năng cơ bản nhất mà người dùng có thể tạo cho thư viện HTTP Client: cung cấp cho tôi lỗi –

+0

vì bạn đã tìm thấy câu trả lời (ở trên) – pstanton

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