Autore Topic: Connessione http get ad un sito web  (Letto 939 volte)

Offline giuseppe.amato92

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4
  • Sistema operativo:
    Windows 8.1
Connessione http get ad un sito web
« il: 07 Settembre 2014, 22:05:08 CEST »
0
Ciao ragazzi, sono nuovo , mi chiamo Giuseppe.
Innanzitutto grazie per tutti i tutorial , senza di voi non so come avrei fatto.

Avevo bisogno di un aiuto: dovrei realizzare una applicazione per visualizzare l'orario delle lezioni della mia facoltà. il sito di riferimento è il seguente:
http://www.ing.unict.it/it/didattica/orario-delle-lezioni?ord=0&cdl=70&task=0&boxchecked=0&anno=0

La prima cosa che ho pensato è quella di fare una connessione di tipo get richiedendo le varie coppie parametro-valore indicata sopra(che varia  a seconda del corso e dell'ordinamento che vado a scegliere). Il codice che ho usato è il seguente:
Codice (Java): [Seleziona]
Map<String, String> params = null;
        params.put("ord", "0");
        params.put("cdl", "70");
        params.put("task", "0");
        params.put("boxchecked", "0");
        params.put("anno", "0");
        try {
                        GetConnection.doGETRequest("www.ing.unict.it/it/didattica", params);
                } catch (GetRequestException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();  //serve per descrivere il tipo di errore
                        }

dove la classe GetConnection è la seguente:
Codice (Java): [Seleziona]
 public static String doGETRequest(String url,Map<String, String> params) throws GetRequestException{
          String paramStr = composeParametersForGetRequest(params);
         
          if (paramStr!=null && paramStr.length() > 0 ) url = url +"?"+paramStr;
          String websiteData = null;
         
          try {
           Log.i(TAG,"GetRequest - url : "+url);
           DefaultHttpClient client = new DefaultHttpClient();
           URI uri = new URI(url);
           HttpGet method = new HttpGet(uri);
           HttpResponse res = client.execute(method);
           InputStream data = res.getEntity().getContent();
           websiteData = parseISToString(data);
          } catch (ClientProtocolException e) {
           throw new GetRequestException();
          } catch (IOException e) {
           throw new GetRequestException();
          } catch (URISyntaxException e) {
           throw new GetRequestException();
          }finally{
           Log.i(TAG,"GetRequest - Request & Response completed");
          }
          return websiteData;
         }
         

         //da inputstream a string
         @SuppressWarnings("deprecation")
        public static String parseISToString(InputStream is){
                  java.io.DataInputStream din = new java.io.DataInputStream(is);
                  StringBuffer sb = new StringBuffer();
                  try{
                   String line = null;
                   while((line=din.readLine()) != null){
                    sb.append(line+"\n");
                   }
                  }catch(Exception ex){
                   ex.getMessage();
                  }finally{
                   try{
                    is.close();
                   }catch(Exception ex){}
                  }
                  return sb.toString();
                 }
         
         //da string a inputstream
         public java.io.InputStream parseStringToIS(String str){
                  if(str==null) return null;
                  str = str.trim();
                  java.io.InputStream in = null;
                  try{
                   in = new java.io.ByteArrayInputStream(str.getBytes("UTF-8"));
                  }catch(Exception ex){}
                  return in;      
                 }



        /***
          * Metodo per comporre la parte di URL relativa ai parametri
          * @param parameters : mappa di parametri
          * @return    : Stringa contenente i parametri concatenati
          */

         @SuppressWarnings("deprecation")
        public static String composeParametersForGetRequest(Map<String, String> parameters){
          String paramStr = "";
          List<String> chiavi = new ArrayList<String>(parameters.keySet());
         
          for (int i = 0 ; i < chiavi.size(); i++){
           String chiave = chiavi.get(i);
           paramStr += chiave+"=";  
           paramStr += URLEncoder.encode(parameters.get(chiave));  
           paramStr += "&";  
          }
          return paramStr;
         }
        }

Poichè non ho mai fatto app android con richieste http e  per ora il sito non è funzionante e non ho modo di verificare la correttezza, volevo  sapere se questo codice poteva andare bene e soprattutto in che modo riceverei la risposta dal server. Scusate l'ignoranza e grazie anticipatament

Post unito: 07 Settembre 2014, 22:39:54 CEST
Qui trovate il logcat appena provo a richiedere al server un determinato orario : è dovuto a qualche errore nel codice dell'app o al server dell'università non funzionante? Grazie ancora(adesso la domanda dovrebbe essere più completa)

Codice (Java): [Seleziona]
09-07 22:35:55.571: W/ApplicationPackageManager(27368): getCSCPackageItemText()
09-07 22:35:57.783: W/ApplicationPackageManager(27368): getCSCPackageItemText()
09-07 22:35:57.813: D/AndroidRuntime(27368): Shutting down VM
09-07 22:35:57.813: W/dalvikvm(27368): threadid=1: thread exiting with uncaught exception (group=0x418c4da0)
09-07 22:35:57.813: E/AndroidRuntime(27368): FATAL EXCEPTION: main
09-07 22:35:57.813: E/AndroidRuntime(27368): Process: com.example.orariolezioniingegneriaunict, PID: 27368
09-07 22:35:57.813: E/AndroidRuntime(27368): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.orariolezioniingegneriaunict/com.example.orariolezioniingegneriaunict.Orario}: java.lang.NullPointerException
09-07 22:35:57.813: E/AndroidRuntime(27368):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305)
09-07 22:35:57.813: E/AndroidRuntime(27368):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
09-07 22:35:57.813: E/AndroidRuntime(27368):    at android.app.ActivityThread.access$900(ActivityThread.java:161)
09-07 22:35:57.813: E/AndroidRuntime(27368):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
09-07 22:35:57.813: E/AndroidRuntime(27368):    at android.os.Handler.dispatchMessage(Handler.java:102)
09-07 22:35:57.813: E/AndroidRuntime(27368):    at android.os.Looper.loop(Looper.java:157)
09-07 22:35:57.813: E/AndroidRuntime(27368):    at android.app.ActivityThread.main(ActivityThread.java:5356)
09-07 22:35:57.813: E/AndroidRuntime(27368):    at java.lang.reflect.Method.invokeNative(Native Method)
09-07 22:35:57.813: E/AndroidRuntime(27368):    at java.lang.reflect.Method.invoke(Method.java:515)
09-07 22:35:57.813: E/AndroidRuntime(27368):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
09-07 22:35:57.813: E/AndroidRuntime(27368):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
09-07 22:35:57.813: E/AndroidRuntime(27368):    at dalvik.system.NativeStart.main(Native Method)
09-07 22:35:57.813: E/AndroidRuntime(27368): Caused by: java.lang.NullPointerException
09-07 22:35:57.813: E/AndroidRuntime(27368):    at com.example.orariolezioniingegneriaunict.Orario.onCreate(Orario.java:55)
09-07 22:35:57.813: E/AndroidRuntime(27368):    at android.app.Activity.performCreate(Activity.java:5426)
09-07 22:35:57.813: E/AndroidRuntime(27368):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
09-07 22:35:57.813: E/AndroidRuntime(27368):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
09-07 22:35:57.813: E/AndroidRuntime(27368):    ... 11 more
« Ultima modifica: 07 Settembre 2014, 22:39:54 CEST da giuseppe.amato92, Reason: Merged DoublePost »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Connessione http get ad un sito web
« Risposta #1 il: 08 Settembre 2014, 07:12:40 CEST »
+1
Per fare richieste http usa una libreria, per esempio okhttp oppure asynchttp.

Per vedere come risponde il server, scrivi la stessa GET nel browser del Pc e vedi cosa ti ritorna.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline tonno16

  • Utente storico
  • *****
  • Post: 1198
  • Respect: +58
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Connessione http get ad un sito web
« Risposta #2 il: 08 Settembre 2014, 09:03:22 CEST »
0
Ma in questo caso non andrebbe oarsato l' xml?

Offline giuseppe.amato92

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4
  • Sistema operativo:
    Windows 8.1
Re:Connessione http get ad un sito web
« Risposta #3 il: 08 Settembre 2014, 10:28:11 CEST »
0
Grazie ragazzi, ho appena scaricato la libreria async . Adesso col file .jar che mi ritrovo cosa dovrei fare per portarlo su eclipse?
Nel browser per verificare dovrei scrivere questa rida di codice GetConnection.doGETRequest("www.ing.unict.it/it/didattica", params); con i parametri che ho indicato prima oppure solo l'URL ?
Per quanto riguarda il parsing xml , è l'unica soluzione o le http request vanno bene pure?
Grazie  :-)

Offline tonno16

  • Utente storico
  • *****
  • Post: 1198
  • Respect: +58
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Connessione http get ad un sito web
« Risposta #4 il: 08 Settembre 2014, 19:56:51 CEST »
0
MI è venuto un dubbio e spero che te ho altri possano rispondere:

nel caso io ho una pagina elencoorari.php che mi dia come output una stringa in formato json, bene riesco a serializzare gli oggetti e creare una lista nella mia app android.

Ma nel caso la pagina elencoorari.php ri riferisce ad una pagina normale quindi con html titoli schede etc etc etc, ovviamente al suo interno ci sara un include(elencooraridettagliati.php) che all'interno di un form mi visualizza gli orari come si procede?

Ho simulato proprio il link che hai postato tu. Ovvero come ricavare dei dati in uno scenario simile

Offline giuseppe.amato92

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4
  • Sistema operativo:
    Windows 8.1
Re:Connessione http get ad un sito web
« Risposta #5 il: 08 Settembre 2014, 20:44:24 CEST »
0
MI è venuto un dubbio e spero che te ho altri possano rispondere:

nel caso io ho una pagina elencoorari.php che mi dia come output una stringa in formato json, bene riesco a serializzare gli oggetti e creare una lista nella mia app android.

Ma nel caso la pagina elencoorari.php ri riferisce ad una pagina normale quindi con html titoli schede etc etc etc, ovviamente al suo interno ci sara un include(elencooraridettagliati.php) che all'interno di un form mi visualizza gli orari come si procede?

Ho simulato proprio il link che hai postato tu. Ovvero come ricavare dei dati in uno scenario simile

Spero ti rispondano altri per avere conferma ma forse dovresti fare il parsing. Non sono sicuro comunque

Offline denper

  • Utente normale
  • ***
  • Post: 290
  • Respect: +60
    • Mostra profilo
    • Anddenper
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    denper
  • Sistema operativo:
    Window 7, Windows XP
Re:Connessione http get ad un sito web
« Risposta #6 il: 09 Settembre 2014, 08:45:22 CEST »
+1
Ciao,
per le comunicazioni via http ti consiglio di utilizzare Volley, tale libreria viene usata anche nelle applicazioni di Google.
Transmitting Network Data Using Volley | Android Developers

Per il parsing di pagine html ci sono molte librerie utili, qui un elenco:
Open Source HTML Parsers in Java
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. [A.Einstein]

Proteggi la tua privacy! Utilizza GhostPhone! https://play.google.com/store/apps/details?id=com.denper.gp
Giochi a Winforlife e Superenalotto e sei stanco di controllare le tue schedine manualmente? Prova Checkwin: https://play.google.com/store/apps/details?id=com.denper.checkwintrial

Offline giuseppe.amato92

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4
  • Sistema operativo:
    Windows 8.1
Re:Connessione http get ad un sito web
« Risposta #7 il: 09 Settembre 2014, 09:41:22 CEST »
0
Grazie di tutto , molto gentile . Appena provo vi faccio sapere  :-)

Offline giuseppe.amato92

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4
  • Sistema operativo:
    Windows 8.1
Re:Connessione http get ad un sito web
« Risposta #8 il: 10 Settembre 2014, 22:23:36 CEST »
0
Ciao,
per le comunicazioni via http ti consiglio di utilizzare Volley, tale libreria viene usata anche nelle applicazioni di Google.
Transmitting Network Data Using Volley | Android Developers

Ho provato sia con Volley che con OKHttp ma niente, non riesco a creare la connessione. Potresti gentilmente postare il codice per la connessione, per favore? Grazie  :-)

Offline tonno16

  • Utente storico
  • *****
  • Post: 1198
  • Respect: +58
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Connessione http get ad un sito web
« Risposta #9 il: 10 Settembre 2014, 22:27:45 CEST »
0
Da quello che so in quel sito fai la richiesta get e poi devi passare tutta la pagina

Offline giuseppe.amato92

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4
  • Sistema operativo:
    Windows 8.1
Re:Connessione http get ad un sito web
« Risposta #10 il: 10 Settembre 2014, 22:32:12 CEST »
0
Da quello che so in quel sito fai la richiesta get e poi devi passare tutta la pagina


Ho provato a fare la richiesta get passando tutto l url completo e non separato con l add.Params  pero mi dice "skipped 167 frames ! The app May be doing too much work on its Main thread" . Questo credo sia dovuto al fatto che non sia una connessione asynchronous

Post unito: 10 Settembre 2014, 22:33:03 CEST
Intendevi questo per passare la pagina completa vero ?

Offline tonno16

  • Utente storico
  • *****
  • Post: 1198
  • Respect: +58
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Connessione http get ad un sito web
« Risposta #11 il: 10 Settembre 2014, 22:40:50 CEST »
+1
Mettila in un asynk task

Offline giuseppe.amato92

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4
  • Sistema operativo:
    Windows 8.1
Re:Connessione http get ad un sito web
« Risposta #12 il: 10 Settembre 2014, 22:42:26 CEST »
0
Grazie , non ci avevo pensato proprio . Domani provo e ti faccio sapere :-)

Post unito: 11 Settembre 2014, 10:24:11 CEST
Ho provato con AsyncTask e adesso va :-) Un ultima cosa prima di impostare il topic come solved: ho ottenuto la risposta dal server e ho fatto la print sul logcat per vedere cosa ritornasse. Giustamente mi ha ritornato l'intera pagina che avevo richiesto. Adesso per mostrare questa pagina nella'Activity  della mia applicazione cosa  dovrei fare? Grazie
« Ultima modifica: 11 Settembre 2014, 10:24:11 CEST da giuseppe.amato92, Reason: Merged DoublePost »

Offline tonno16

  • Utente storico
  • *****
  • Post: 1198
  • Respect: +58
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Connessione http get ad un sito web
« Risposta #13 il: 11 Settembre 2014, 13:58:47 CEST »
0
Cosa intendi? Se devi visualizzare tutta la pagina allora potevi usare una web view. Altrimenti se vuoi determinate cose devi parsare la pagina.

Comunque se sei UNIBO potresti farti dire come si chiama la pagina PHP che riempi la table. Così sarebbe ottimo

Offline giuseppe.amato92

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4
  • Sistema operativo:
    Windows 8.1
Re:Connessione http get ad un sito web
« Risposta #14 il: 11 Settembre 2014, 14:08:43 CEST »
0
Cosa intendi? Se devi visualizzare tutta la pagina allora potevi usare una web view. Altrimenti se vuoi determinate cose devi parsare la pagina.

Comunque se sei UNIBO potresti farti dire come si chiama la pagina PHP che riempi la table. Così sarebbe ottimo

Forse mi sono spiegato male. Devo parsare la pagina. Non sono unibo ma unict. Grazie lo stesso :-)


Post unito: [time]12 Settembre 2014, 11:20:54 CEST[/time]
Ho provato a fare il parsing. Ecco la classe usata:
Codice (Java): [Seleziona]
                public  void showParse(TextView textview) throws ParseException, IOException, JSONException{
                        HttpEntity entity = response.getEntity();
                        String responseBody = EntityUtils.toString(entity);
                        //final JSONObject jObject=new JSONObject(responseBody);
                Document doc= Jsoup.parse(responseBody);
                Elements els = doc.select("div[class=module-body]");
                String risultato= els.toString();
                System.out.print(risultato);
                textview.setText(risultato);

        }

ed ecco il LogCat

Codice (Java): [Seleziona]
09-12 11:17:44.047: E/AndroidRuntime(11632): FATAL EXCEPTION: AsyncTask #1
09-12 11:17:44.047: E/AndroidRuntime(11632): Process: com.example.orariolezioniingegneriaunict, PID: 11632
09-12 11:17:44.047: E/AndroidRuntime(11632): java.lang.RuntimeException: An error occured while executing doInBackground()
09-12 11:17:44.047: E/AndroidRuntime(11632):    at android.os.AsyncTask$3.done(AsyncTask.java:300)
09-12 11:17:44.047: E/AndroidRuntime(11632):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
09-12 11:17:44.047: E/AndroidRuntime(11632):    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
09-12 11:17:44.047: E/AndroidRuntime(11632):    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
09-12 11:17:44.047: E/AndroidRuntime(11632):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
09-12 11:17:44.047: E/AndroidRuntime(11632):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
09-12 11:17:44.047: E/AndroidRuntime(11632):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
09-12 11:17:44.047: E/AndroidRuntime(11632):    at java.lang.Thread.run(Thread.java:841)
09-12 11:17:44.047: E/AndroidRuntime(11632): Caused by: java.lang.IllegalStateException: Content has been consumed
09-12 11:17:44.047: E/AndroidRuntime(11632):    at org.apache.http.entity.BasicHttpEntity.getContent(BasicHttpEntity.java:84)
09-12 11:17:44.047: E/AndroidRuntime(11632):    at org.apache.http.conn.BasicManagedEntity.getContent(BasicManagedEntity.java:100)
09-12 11:17:44.047: E/AndroidRuntime(11632):    at org.apache.http.util.EntityUtils.toString(EntityUtils.java:112)
09-12 11:17:44.047: E/AndroidRuntime(11632):    at org.apache.http.util.EntityUtils.toString(EntityUtils.java:146)
09-12 11:17:44.047: E/AndroidRuntime(11632):    at com.example.orariolezioniingegneriaunict.HttpConnection.showParse(HttpConnection.java:230)
09-12 11:17:44.047: E/AndroidRuntime(11632):    at com.example.orariolezioniingegneriaunict.Orario$HttpGetTask.doInBackground(Orario.java:91)
09-12 11:17:44.047: E/AndroidRuntime(11632):    at com.example.orariolezioniingegneriaunict.Orario$HttpGetTask.doInBackground(Orario.java:1)
09-12 11:17:44.047: E/AndroidRuntime(11632):    at android.os.AsyncTask$2.call(AsyncTask.java:288)
09-12 11:17:44.047: E/AndroidRuntime(11632):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
09-12 11:17:44.047: E/AndroidRuntime(11632):    ... 4 more

 :'( :'( :'(

Post unito: 12 Settembre 2014, 11:22:23 CEST
Ho dimenticato: l'errore è quando eseguo doInBackgroun perchè li ho richiamato la classe che ho postato sopra per il parsing
« Ultima modifica: 12 Settembre 2014, 11:22:23 CEST da giuseppe.amato92, Reason: Merged DoublePost »