Visualizzazione stampabile
-
Web Login tramite app
Vorrei provare a fare un'applicazione che, dopo aver fatto un login con un sito, mi restituisca alcune informazioni riguardo al proprio account (diciamo che il processo dovrebbe essere simile come concetto ai widget del credito di Andrea).
Quindi, non avendo mai sviluppato una cosa simile, mi chiedo: come è possibile "loggarsi" ad un account di un sito tramite un'app? E come scaricare le info desiderate?
Grazie mille!:-[:)
-
Quote:
Originariamente inviato da
TheJag
Vorrei provare a fare un'applicazione che, dopo aver fatto un login con un sito, mi restituisca alcune informazioni riguardo al proprio account (diciamo che il processo dovrebbe essere simile come concetto ai widget del credito di Andrea).
Quindi, non avendo mai sviluppato una cosa simile, mi chiedo: come è possibile "loggarsi" ad un account di un sito tramite un'app? E come scaricare le info desiderate?
Grazie mille!:-[:)
Ma a cosa ti devi collegare?! Ovviamente ogni gestione di login è diversa...
-
Fondamentalmente vorrei che l'utente scrivesse login e pass nella mia app e la mia app facesse in automatico il login col sito e mostrasse all'utente alcune informazioni prese proprio dal sito, come ad esempio appunto il credito residuo sulla propria sim vodafone.
-
Quote:
Originariamente inviato da
TheJag
Fondamentalmente vorrei che l'utente scrivesse login e pass nella mia app e la mia app facesse in automatico il login col sito e mostrasse all'utente alcune informazioni prese proprio dal sito, come ad esempio appunto il credito residuo sulla propria sim vodafone.
premetto che non ho mai fatto un'app così per android, vado ad intuito.
devi fare un piccolo 'reverse' del sito che vuoi gestire dalla tua app e capire, chiamata dopo chiamata, come fa il login:
1) studiati quali url chiama quando sul sito premi il pulsante per loggarti
2) studiati come crea e quali informazioni manda nella form contenuta nella pagina di login
3) replica le chiamate tramite le classi che stanno sotto android.webkit e capire quali sono le migliori per il tuo scopo.
4) fai il parse delle info e riarrangiale per la tua app.
O perlomeno... io inizierei così.
-
Quote:
Originariamente inviato da
TheJag
Fondamentalmente vorrei che l'utente scrivesse login e pass nella mia app e la mia app facesse in automatico il login col sito e mostrasse all'utente alcune informazioni prese proprio dal sito, come ad esempio appunto il credito residuo sulla propria sim vodafone.
siti come quelli degli operatori telefonici sono abbastanza complicati!! Devi studiarti tutto per bene altrimenti non funzionerà mai!
...giustissimo il discorso del reverse, tramite sorgente pagine e (se ti può essere d'aiuto) addon per firefox come FIREBUG, studiati tutti i parametri che vengono inviati al server e poi studiati le android webkit per cercare di "replicare" il login! ;)
-
Aggiungo uno snippet preso dal libro di Meier:
String myFeed = getString(R.string.my_feed);
try {
URL url = new URL(myFeed);
URLConnection connection = url.openConnection();
HttpURLConnection httpConnection = (HttpURLConnection)connection;
int responseCode = httpConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
InputStream in = httpConnection.getInputStream();
[ ... Process the input stream as required ... ]
}
}
catch (MalformedURLException e) { }
catch (IOException e) { }
così puoi fare una Chiamata HTTP standard.
Poi devi implementare GET o POST adeguata in base alla tua bella form di login e al sito in questione.
Spero di averti aiutato a comprendere meglio il 'giro del fumo'
-
Grazie mille per i consigli!
-
Ho provato a fare una semplice connessione ad uno script php col metodo post e tutto funziona, ma se inserisco come url quello del sito obiettivo della mia app allora ricevo un errore del tipo: The target server failed to respond!
Non ho usato webkit ma le librerie standard HTTP org.apache.http.*.
-
Quote:
Originariamente inviato da
TheJag
Ho provato a fare una semplice connessione ad uno script php col metodo post e tutto funziona, ma se inserisco come url quello del sito obiettivo della mia app allora ricevo un errore del tipo: The target server failed to respond!
Non ho usato webkit ma le librerie standard HTTP org.apache.http.*.
sicuro di aver fatto le cose come si deve?
Non è che cerchi di collegarti ad un sito in HTTPS mentre il tuo script gira su un webserver in HTTP?
Poi sei sicuro di aver correttamente inserito, nel tuo codice, tutti i campi che la form richiede?
puoi darci qualche informazione in più?
-
Ahia, il sito è in HTTPS, non ci avevo badato, errore mio.
Ma ho cercato e non sono sicuro di aver trovato le librerie per gestire connessioni sicure HTTPS.
Probabilmente l'errore sta tutto li per adesso.
Ad ogni modo la mia app deve fare solo tre passaggi: autenticazione, passaggio ad una seconda pagina tramite un link e lettura dei dati ivi contenuti.
La form ha solo due campi (firebug non ha evidenziato altri campi hidden o altro) con id username e password quindi devo solo inviare quei due mi pare.
Grazie per la spinta, alle volte si fissa la pagliuzza e non si vede la trave... :)
-
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.
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())*/;
}
Qui invece è la parte di codice dove utilizzo la classe per effettuare il login.
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());
}
La funzione genera una eccezione nel blocco TRY e l'errore è il seguente:
"The target server failed to respond".
-
-
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()?
-
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:
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
-
Si infatti l'ho riutilizzata con successo, grazie.
-
Quindi, mistero risolto :)
-
Si si, tutto procede per il meglio, grazie a tutti!
-
Ma quando ci farei vedere uno screen della tua app ?
-
Conto di finirla entro una settimana!
Devo solo aggiustare un poco la grafica perchè attualmente è un po' spoglia!
-
Come non detto, cercando di migliorare il codice mi sono imbattuto in un piccolo problema:
Prima effettuavo il fetch dei dati https all'inizio della mia app (quindi c'era un lungo caricamento), ora ho modificato il tutto in modo che le richieste https vengano effettuate a comando quando realmente sono necessarie e quindi ho optato per modificare la classe HttpComm in modo da avere dei metodi e delle campi (client su tutti) statici così da poter essere richiamati da ogni activity senza dover passare nessuna istanza o parametro di Client da una all'altra.
Il problema che sorge è che quando effettuo una seconda richiesta post, essa non parte proprio (nessuno scambio dati con la rete) perché da come ho capito il client è perso e così anche i cookie ecc.
Infatti se reinizializzo il client, la richiesta post funziona tranquilamente.
Esiste un modo per non perdere il client?
-
Aggiornemento: ora, senza apparenti cambi di codice, l'attività di rete sembra andare, il problema singolare è che ora, alla seconda richiesta POST il server mi risponde picche (sessione persa), ma alla terza risulto ancora "loggato" e quindi procedo!!! :| ???
Qualche suggerimento?
-
E' possibile avere un esempio del codice che fa la POST in HTTPS ?