Tenho problemas em recuperar a resposta Json caso o servidor retorne um erro. Veja os detalhes abaixo.
Como faço a solicitação
Eu uso java.net.HttpURLConnection
. Eu configuro as propriedades da solicitação, então:
conn = (HttpURLConnection) url.openConnection();
Depois disso, quando a solicitação é bem-sucedida, recebo a resposta Json:
br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
sb = new StringBuilder();
String output;
while ((output = br.readLine()) != null) {
sb.append(output);
}
return sb.toString();
... e o problema é:
Não consigo recuperar o Json recebido quando o servidor retorna algum erro como 50x ou 40x ,. A linha a seguir lança IOException:
br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
// throws java.io.IOException: Server returned HTTP response code: 401 for URL: www.example.com
O servidor envia corpo com certeza, vejo na ferramenta externa Burp Suite:
HTTP/1.1 401 Unauthorized
{"type":"AuthApiException","message":"AuthApiException","errors":[{"field":"email","message":"Invalid username and/or password."}]}
Posso obter a mensagem de resposta (ou seja, "Erro interno do servidor") e o código (ou seja, "500") usando os seguintes métodos:
conn.getResponseMessage();
conn.getResponseCode();
Mas não consigo recuperar o corpo da solicitação ... talvez haja algum método que não observei na biblioteca?
fonte
Para deixar as coisas bem claras, aqui está meu código de trabalho:
fonte
HttpURLConnection.getErrorStream()
(sun.net.www.protocol.http
implementação) retorna anull
menos queresponseCode >= 400
, portanto, sua verificação para 299 provavelmente está incorreta.String responseBody = br.lines().collect(Collectors.joining());
Esta é uma maneira fácil de obter uma resposta bem-sucedida do servidor, como o PHP echo, caso contrário, uma mensagem de erro.
fonte