6

자바에서 CouchDB를위한 REST 클라이언트를 작성 중이다. 다음 코드는 상당히 표준 적이어야합니다.Java HttpURLConnection.getInputStream, get 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); 
    } 

인증에 실패하면 어떻게 될지 테스트하고 싶습니다. 그러나 인증에 실패하면 HttpURLConnection의 getInputStream을 호출 할 때 서버 응답 401을 말하는 IOException이 발생합니다. 서버가 성공 또는 실패 여부에 관계없이 응답 할 경우 서버가 반환하는 값을 읽을 수 있어야합니다. 그리고이 경우에는 서버가 말풍선을 사용하여 서버에 GET을 수행하고 인증에 실패하면 일부 오류 메시지가있는 응답 본문으로 JSON 객체가 생기므로 서버가 본문에 일부 텍스트를 반환합니다.

401이더라도 응답 본문을 가져 오는 방법이 있습니까?

+0

'for'루프를 사용하여 코드를 더 읽기 쉽도록 repalce 할 수 있습니다. – user3001

답변

16

getInputStream() 또는 getErrorStream()을 사용해야하는지 결정하려면 getResponseCode()을 사용하여 http 상태를 확인해야합니다. 이 경우 오류 스트림을 읽어야합니다.

+2

감사합니다! 답으로 답장을 수락 할 수 있지만 단 하나의 대답 만 가능할 수 있습니다 ... –