6

Tôi đang viết một máy khách REST cho CouchDB trong Java. Mã sau phải khá chuẩn:Java HttpURLConnection.getInputStream nhưng nhận 401 IOException

this.httpCnt.connect(); 
    Map<String, String> responseHeaders = new HashMap<>(); 
    int i = 1; 
    while (true){ 
     String headerKey = this.httpCnt.getHeaderFieldKey(i); 
     if (headerKey == null) 
      break; 
     responseHeaders.put(headerKey, this.httpCnt.getHeaderField(i)); 
     i++; 
    } 
    InputStreamReader reader = new InputStreamReader(this.httpCnt.getInputStream()); 
    StringBuilder responseBuilder = new StringBuilder(); 
    char[] buffer = new char[1024]; 
    while(true){ 
     int noCharRead = reader.read(buffer); 
     if (noCharRead == -1){ 
      reader.close(); 
      break; 
     } 
     responseBuilder.append(buffer, 0, noCharRead); 
    } 

Tôi muốn kiểm tra điều gì xảy ra nếu xác thực không thành công. Tuy nhiên, nếu xác thực thất bại, khi gọi getInputStream của HttpURLConnection, tôi nhận trực tiếp một IOException nói các phản hồi của máy chủ 401. Tôi cho rằng nếu máy chủ phản hồi cái gì đó, cho dù thành công hay thất bại, nó sẽ có thể đọc được bất kỳ máy chủ nào trả về. Và tôi chắc chắn trong trường hợp này máy chủ trả về một số văn bản trong cơ thể, vì nếu tôi thực hiện một máy chủ sử dụng curl và xác thực không thành công, tôi nhận được một đối tượng JSON làm nội dung phản hồi với một số thông báo lỗi trong đó.

Có cách nào để vẫn nhận được nội dung phản hồi ngay cả khi 401 không?

+0

Bạn có thể kiểm tra lại 'while' bằng các vòng lặp' for' để làm cho mã dễ đọc hơn – user3001

Trả lời

16

Bạn cần kiểm tra trạng thái http bằng cách sử dụng getResponseCode() để quyết định xem bạn có nên sử dụng getInputStream() hoặc getErrorStream() hay không. Trong trường hợp này, bạn cần đọc luồng lỗi.

+2

Cảm ơn! Tôi sẽ chấp nhận câu trả lời của bạn như là câu trả lời, nhưng có thể chỉ có một câu trả lời có thể ... –

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