6

Ich schreibe einen REST-Client für CouchDB in Java. Der folgende Code sollte ziemlich Standard sein:Java HttpURLConnection.getInputStream aber 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); 
    } 

Ich möchte testen, was passiert, wenn die Authentifizierung fehlschlägt. Wenn jedoch die Authentifizierung fehlschlägt, bekomme ich beim Aufruf von getInputStream der HttpURLConnection direkt eine IOException, die die Serverantworten 401 sagt. Ich nehme an, wenn der Server etwas antwortet, egal was Erfolg oder Misserfolg ist, sollte er lesen können, was auch immer der Server zurückgibt. Und ich bin mir sicher, dass der Server in diesem Fall einen Text im Body zurückgibt, denn wenn ich einen GET an den Server unter Verwendung von curl mache und die Authentifizierung fehlschlägt, bekomme ich ein JSON-Objekt als Antworttext mit einigen Fehlermeldungen.

Gibt es eine Möglichkeit, noch den Antworttext zu erhalten, selbst wenn 401?

+0

Sie könnten das 'while' mit' for' Schleifen repalcen, um den Code lesbarer zu machen – user3001

Antwort

16

Sie müssen prüfen, ob der HTTP-Status getResponseCode() verwendet, um zu entscheiden, ob Sie getInputStream() oder getErrorStream() verwenden sollen. In diesem Fall müssen Sie den Fehler-Stream lesen.

+2

Danke! Ich würde Ihre Antwort als Antwort akzeptieren, aber es kann nur eine Antwort geben ... –