Tengo una clase de ayuda bastante básica que estoy usando para hacer todas mis cosas de Http Get/Post. Estoy usando HttpGet, HttpPost y HttpClient de la biblioteca org.apache.http. Todas mis cosas funcionan bien a través de HTTP, pero tan pronto como intenté consumir un servicio que funciona a través de HTTPS, recibo una excepción ClientProtocolException al ejecutar la solicitud. El único mensaje en la excepción es "El servidor no respondió con una respuesta HTTP válida".Publicación HTTP segura en Android
Para probar, envié exactamente la misma carga desde un navegador usando un formulario html simple y Fiddler2 usando RequestBuilder. He enviado cargas útiles inválidas y vacías e incluso he enviado todo lo anterior con y sin encabezados para ver si había algo funky sobre la forma en que los objetos estaban creando la solicitud.
Todo lo que he usado en las pruebas me da una respuesta HTTP válida de 200 estados. El servicio solo me da una estructura que describe el error si le doy algo diferente a lo que espera.
¿Hay algo especial que deba agregar al objeto (s) HttpPost o HttpClient para indicarle que use HTTPS? ¿Tengo que decirle explícitamente que use un puerto diferente?
EDIT:
hecho que registró la fábrica de sockets mal para la comunicación https. Aquí está el método actualizado que utilizo para crear mi objeto HttpClient con la fábrica toma correcta por si acaso alguien busca este tipo de problemas en el futuro:
private HttpClient createHttpClient()
{
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
HttpProtocolParams.setUseExpectContinue(params, true);
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);
return new DefaultHttpClient(conMgr, params);
}
Hola Rich, Gracias por su puesto, que es más o menos la única cosa sobre https en android devuelto por Google. ¿De dónde sacaste la información para escribir el código que muestras aquí? Además, ¿podría explicar el motivo de la llamada a la versión de conjunto, juego de caracteres y ese parámetro? ¿No están asignados por defecto los valores normales? Una pregunta más: está importando org.apache.http.conn.ssl.SSLSocketFactory, ¿verdad? Gracias por aclarar esto –
Estoy bastante seguro de que esto vino del libro Pro Android en Apress. El libro no fue muy bueno, pero el capítulo sobre comunicación http tuvo una gran discusión sobre el diseño práctico cuando una aplicación necesita hacer muchas llamadas a la web. – Rich