Tengo un problema para recuperar la respuesta de Json en caso de que el servidor devuelva un error. Vea los detalles abajo.
Cómo realizo la solicitud
Yo uso java.net.HttpURLConnection
. Configuro propiedades de solicitud, luego lo hago:
conn = (HttpURLConnection) url.openConnection();
Después de eso, cuando la solicitud es exitosa, obtengo la respuesta Json:
br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
sb = new StringBuilder();
String output;
while ((output = br.readLine()) != null) {
sb.append(output);
}
return sb.toString();
... y el problema es:
No puedo recuperar Json recibido cuando el servidor devuelve algún error como 50x o 40x. La siguiente línea arroja IOException:
br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
// throws java.io.IOException: Server returned HTTP response code: 401 for URL: www.example.com
El servidor envía el cuerpo seguro, lo veo en la herramienta externa Burp Suite:
HTTP/1.1 401 Unauthorized
{"type":"AuthApiException","message":"AuthApiException","errors":[{"field":"email","message":"Invalid username and/or password."}]}
Puedo obtener un mensaje de respuesta (es decir, "Error interno del servidor") y el código (es decir, "500") usando los siguientes métodos:
conn.getResponseMessage();
conn.getResponseCode();
Pero no puedo recuperar el cuerpo de la solicitud ... ¿tal vez hay algún método que no noté en la biblioteca?
fuente
Para aclarar las cosas, aquí está mi código de trabajo:
fuente
HttpURLConnection.getErrorStream()
(sun.net.www.protocol.http
implementación) devuelve anull
menos queresponseCode >= 400
, por lo que su comprobación de 299 probablemente sea incorrecta.String responseBody = br.lines().collect(Collectors.joining());
Esta es una manera fácil de obtener una respuesta exitosa del servidor como PHP echo de lo contrario un mensaje de error.
fuente