Qualche suggerimento per una connessione https?
Non sono riuscito a trovare nulla purtroppo.![]()
Qualche suggerimento per una connessione https?
Non sono riuscito a trovare nulla purtroppo.![]()
Vi posto alcuni pezzi di codice nella speranza che possiate avere una panoramica migliore sul mio problema.
Questi sono due metodi della classe che ho creato per gestire la comunicazione http.
Il primo effettua la connessione e fa un invio POST, il secondo riceve i dati e li ritorna in forma di stringa.
La classe l'ho chiamata HttpComm.
Qui invece è la parte di codice dove utilizzo la classe per effettuare il login.codice:public static HttpResponse doPost(String url, Map<String, String> postData) throws ClientProtocolException, IOException { HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); if (postData != null && postData.isEmpty() == false) { List<NameValuePair> dataList = new ArrayList<NameValuePair>(postData.size()); Iterator<String> iKeys = postData.keySet().iterator(); while (iKeys.hasNext()) { String k = iKeys.next(); String v = postData.get(k); dataList.add(new BasicNameValuePair(k, v)); } httpPost.setEntity(new UrlEncodedFormEntity(dataList)); } return httpClient.execute(httpPost); } public static String getResponse(HttpResponse r) throws IOException { InputStream is = r.getEntity().getContent(); BufferedInputStream bis = new BufferedInputStream(is); ByteArrayBuffer baf = new ByteArrayBuffer(20); int current = 0; while ((current = bis.read()) != -1) { baf.append((byte) current); } String res = ""; res = EntityUtils.toString(r.getEntity()); // res = baf.toByteArray().toString(); return res /*new String(baf.toByteArray())*/; }
La funzione genera una eccezione nel blocco TRY e l'errore è il seguente:codice:String url = "https://url"; String resp = ""; Map<String, String> accountValues = new HashMap<String, String>(); accountValues.put("username_id", params[0]); accountValues.put("password_id", params[1]); try { HttpResponse r = HttpComm.doPost(url, accountValues); resp = HttpComm.getResponse(r); Log.e("RESPONSE_CODE: ", Integer.toString(r.getStatusLine().getStatusCode())); Log.e("RESPONSE_STRING: ", resp); } catch (Exception ex){ Log.e("!!!ERRORE!!!: ", ex.getMessage()); }
"The target server failed to respond".
Sicuro non funzioni?
Twitter @veke87
non va, l'errore che mi da è quello!
Se invece mi collego ad un server prova (quello di anddev.org) in cui c'è una pagina di prova per l'invio http post, va a meraviglia!
Ma una connessione https si gestisce in modo diverso per caso?
Oppure il problema sta nel server che non risponde per colpa sua e non mia?
Se come url metto 'http://www.google.com' come "errore" esce: Content has been consumed.
Sono sempre più confuso!
Probabilmente leggi piu di una volta l'HTTPEntity... Sei sicuro di utilizzare solo una volta .getEntity().getContent()?
Twitter @veke87
Si, il problema dell'errore sul sito di Google era effettivamente la ripetizione di getEntity.
Però il problema sul mio sito target "The target server failed to respond" persiste.
BOH!
Bene, ora sembra andare!
Ho dovuto implementare una piccola funzione trovata su un tutorial in giro per il web che permette di personalizzare il un HttpClient con parametri e impostazioni e soprattutto implementare una SslFactory per le comunicazioni sicure.
Posto il codice, se qualcuno ne avesse bisogno:
1
2/**
3* Creates a HttpClient with http and http parameters
4*/
5public static DefaultHttpClient getClient() {
6DefaultHttpClient ret = null;
7// Parameters
8HttpParams params = new BasicHttpParams();
9HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
10HttpProtocolParams.setContentCharset(params, "utf-8");
11params.setBooleanParameter("http.protocol.expect-continue", false);
12// Schemes for http
13SchemeRegistry registry = new SchemeRegistry();
14registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
15// Schemes for http and https
16final SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory();
17sslSocketFactory.setHostnameVerifier(SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
18registry.register(new Scheme("https", sslSocketFactory, 443));
19// Client generation
20ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, registry);
21ret = new DefaultHttpClient(manager, params);
22return ret;
23}
24
Ora il mio problema rimanente sarebbe mantenere la sessione loggata mentre clicco altri link della pagina.
Qualche piccolo consiglio al riguardo?
Devo implementare l'uso dei cookie?
Io ti consiglio di riutilizzare il DefaulHttpClient ottenuto per la prima istanza. In questo modo non devi fartene nulla dei cookies perchè si arrangia totalmente DefaultHttpClient
Twitter @veke87