android - setrequestproperty - httpurlconnection post json
¿Utilizando HttpURLConnection y HttpsURLConnection para conectarse a un https? (1)
- Se está utilizando la conexión HTTPS.
- Comportamientos por defecto
- No estoy seguro, pero lea a continuación.
Acabo de escribir un código como prueba (ver todo abajo). Lo que termina sucediendo es que la llamada URL.openConnection () le devolverá una clase libcore.net.http.HttpsURLConnectionImpl .
Esta es una implementación de HttpsURLConnection pero HttpsURLConnection hereda de HttpURLConnection. Así que estás viendo el polimorfismo en acción.
Mirando más en el depurador, parece que la clase está usando los métodos predeterminados de fábrica.
hostnameVerifier = javax.net.ssl.DefaultHostnameVerifier
sslSocketFactory = org.apache.harmony.xnet.provider.jsse.OpenSSLSocketFactoryImpl
Sobre esta base, parece que se están utilizando los comportamientos predeterminados. No sé si eso significa que estás confiando en todo, pero definitivamente estás estableciendo una conexión HTTPS.
La documentación de sugerencias sobre la conexión confiará automáticamente en las CA que son bien conocidas pero no autofirmadas. (ver más abajo) No probé esto pero tienen un código de ejemplo sobre cómo lograrlo aquí .
Si una aplicación desea confiar en los certificados de Autoridad de Certificación (CA) que no forman parte del sistema, debe especificar su propio X509TrustManager a través de un conjunto SSLSocketFactory en la conexión HttpsURLC.
Runnable r = new Runnable() {
public void run() {
try {
URL test = new URL("https://www.google.com/");
HttpURLConnection connection = (HttpURLConnection) test.openConnection();
InputStream is = connection.getInputStream();
StringWriter sw = new StringWriter();
String value = new java.util.Scanner(is).useDelimiter("//A").next();
Log.w("GOOGLE", value);
} catch(Exception e) {
Log.e("Test", e.getMessage());
}
}
};
Thread t = new Thread(r);
t.start();
¿Cuáles son las diferencias si trato de conectarme a un "https" usando HttpURLConnection
y HttpsURLConnection
?
Pude conectarme a "https" utilizando tanto HttpURLConnection
como HttpsURLConnection
así que estoy confundido. ¿Pensé que solo puedo establecer una conexión a un "https" si uso HttpsURLConnection?
A continuación se presentan algunas de mis preguntas:
- Si pude abrir una conexión a un "https" usando HttpURLConnection, ¿mi conexión aún está en "https" o se convierte en "http"?
- ¿Qué hay de la validación de certificados? Como no tuve ningún
SSLSocketFactory
yHostnameVerifier
en miHttpURLConnection
mientras me conectaba a un "https", ¿quéSSLSocketFactory
yHostnameVerifier
estoy usando? - ¿Significa que estoy confiando en todo sin importar si el certificado es de confianza o no?