Ho una classe di helper piuttosto semplice che sto usando per fare tutte le mie cose Get/Post Http. Sto usando HttpGet, HttpPost e HttpClient dalla libreria org.apache.http. Tutte le mie cose funzionano bene su HTTP, ma non appena ho provato a utilizzare un servizio che funziona su HTTPS, ottengo un ClientProtocolException quando eseguo la richiesta. L'unico messaggio nell'eccezione è "Il server non è riuscito a rispondere con una risposta HTTP valida".Posta HTTP sicura in Android
Per testare, ho inviato lo stesso payload esatto da un browser utilizzando un semplice modulo html e Fiddler2 utilizzando RequestBuilder. Ho inviato payload non validi e vuoti e persino inviato tutto quanto sopra con e senza intestazioni per vedere se c'era qualcosa di strano nel modo in cui gli oggetti stavano costruendo la richiesta.
Tutto ciò che ho usato nei test mi dà una risposta HTTP 200 valida. Il servizio mi fornisce solo una struttura che descrive l'errore se gli dò qualcosa di diverso da quello che si aspetta.
C'è qualcosa di speciale che devo aggiungere agli oggetti HttpPost o HttpClient per dirgli di usare HTTPS? Devo dire esplicitamente di usare una porta diversa?
EDIT:
ho infatti registrato la fabbrica presa sbagliata per la comunicazione HTTPS. Ecco il metodo aggiornata che uso per creare il mio oggetto HttpClient con la corretta presa di fabbrica nel caso in cui qualcuno cerca di questo tipo di problema in 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);
}
Hi Rich, Grazie per il tuo post, è praticamente l'unica cosa su https su Android restituito da google. Dove hai ricevuto le informazioni per scrivere il codice che mostri qui? Inoltre, potresti spiegare il motivo per cui hai chiamato set version, charset e quel parametro? Per impostazione predefinita non sono assegnati i valori normali? Un'altra domanda: stai importando org.apache.http.conn.ssl.SSLSocketFactory, giusto? Grazie per chiarire questo –
Sono abbastanza sicuro che questo è venuto dal libro Pro Android su Apress. Il libro non è stato grandioso, ma il capitolo sulla comunicazione http ha avuto una grande discussione sulla progettazione pratica quando un'app deve effettuare molte chiamate web. – Rich