"Conexión ya establecida" excepción en HttpsURLConnection
Estoy intentando hacer una petición del POSTE usando HttpsURLConnection
, y consigo
java.net.ProtocolException: Connection already established
on setRequestMethod
Extrañamente, conn.connected
devuelve false
justo antes.
- Autenticación de cliente SSL en Android 4.x
- El servidor no admite la suite de cifrado predeterminada de Android 5.0
- ¿Cómo anular la lista de cifrado enviada al servidor por Android cuando se utiliza HttpsURLConnection?
- Webview no puede cargar https url en android?
- Autenticación de cliente SSL con certificado en Android
¿Qué me estoy perdiendo?
URL url = new URL("https://ws.audioscrobbler.com/2.0/"); HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); conn.setReadTimeout(15000); conn.setConnectTimeout(15000); // here conn.connected is false conn.setRequestMethod("POST"); // here I get java.net.ProtocolException: Connection already established conn.setDoInput(true);
EDITAR
He intentado DefaultHttpClient y funciona, así que lo usaré en su lugar.
- Cómo obtener los detalles del certificado SSL de la solicitud de conexión a URL
- Reutilizar conexiones TCP con HttpsUrlConnection
- Android: java.lang.IllegalStateException: Ya conectado
- Error de E / S durante la llamada al sistema,
- Certificado auto-firmado de Android: Ancla de confianza para la ruta de certificación no encontrada
- Android HttpsUrlConnection javax.net.ssl.SSLException La conexión se cerró por el error del apretón de manos del par al usar el truststore local
- HttpsURLconnection para publicar y obtener en Android
- Cómo deshabilitar SSLv3 en android para HttpsUrlConnection?
He intentado DefaultHttpClient
y funciona, así que lo DefaultHttpClient
su lugar.
Para cualquier otra persona que se ejecuta en este problema, tuve un orden de operaciones cuestión que sólo me afectó cuando estaba haciendo un HTTP POST que tenía contenido en el cuerpo de la solicitud. No está totalmente claro en todos los escenarios cuando HttpURLConnection realmente está iniciando la conexión con el servidor.
Mi solicitud inicial se veía así:
HttpURLConnection conn = null; try { conn = (HttpURLConnection) baseUrl.openConnection(); conn.setConnectTimeout(connectTimeoutMillis); conn.setReadTimeout(requestTimeoutMillis); //required for reading a response body conn.setDoInput(true); //Not all request types have a body (eg GET usually doesn't) if(requestBody != null && requestBody.length > 0) { conn.setDoOutput(true); conn.setFixedLengthStreamingMode(requestBody.length); conn.getOutputStream().write(requestBody); conn.getOutputStream().flush(); conn.getOutputStream().close(); } try { conn.setRequestMethod(verb.toUpperCase()); } catch (final ProtocolException e) { response.setError("Invalid HTTP verb \"" + verb + "\" received.",""); Log.e(TAG, response.errorMessage, e); return response; }
Resulta que no se puede llamar a "conn.setRequestMethod (…)" después de haber llamado "conn.getOutputStream ()", así que en mi caso, la solución simple era la llamada "conn.setRequestMethod (…) "antes de tratar de escribir al cuerpo de la solicitud. El código de trabajo es:
HttpURLConnection conn = null; try { conn = (HttpURLConnection) baseUrl.openConnection(); conn.setConnectTimeout(connectTimeoutMillis); conn.setReadTimeout(requestTimeoutMillis); //required for reading a response body conn.setDoInput(true); try { conn.setRequestMethod(verb.toUpperCase()); } catch (final ProtocolException e) { response.setError("Invalid HTTP verb \"" + verb + "\" received.",""); Log.e(TAG, response.errorMessage, e); return response; } //Not all request types have a body (eg GET usually doesn't) if(requestBody != null && requestBody.length > 0) { conn.setDoOutput(true); conn.setFixedLengthStreamingMode(requestBody.length); conn.getOutputStream().write(requestBody); conn.getOutputStream().flush(); conn.getOutputStream().close(); }
El único cambio real fue simplemente cambiar el orden de las llamadas y que se deshizo de la excepción. Esperemos que corrija el problema para cualquier otra persona que tuviera este problema.