6

Sto scrivendo un client REST per CouchDB in Java. Il seguente codice dovrebbe essere abbastanza standard:Java HttpURLConnection.getInputStream ma ottengo 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); 
    } 

Voglio verificare cosa succede se l'autenticazione fallisce. Tuttavia, se l'autenticazione fallisce, quando si chiama getInputStream di HttpURLConnection, ottengo direttamente una IOException che dice che le risposte del server 401. Suppongo che se il server risponde a qualcosa, indipendentemente dal successo o dall'errore, dovrebbe essere in grado di leggere qualsiasi cosa ritorni. E sono sicuro che in questo caso il server restituisce del testo nel corpo, poiché se faccio un GET al server usando curl e l'autenticazione fallisce, ottengo un oggetto JSON come corpo della risposta con alcuni messaggi di errore.

C'è un modo per ottenere ancora il corpo risposta anche se 401?

+0

È possibile ripetere il 'while' con i cicli' for' per rendere il codice più leggibile – user3001

risposta

16

È necessario verificare lo stato http utilizzando getResponseCode() per decidere se utilizzare getInputStream() o getErrorStream(). In questo caso, è necessario leggere il flusso di errori.

+2

Grazie! Accetterei la tua risposta come risposta, ma può esserci una sola risposta possibile ... –