SimoDax / Trenitalia-API

A documentation of trenitalia's rest api.
GNU General Public License v3.0
82 stars 3 forks source link

Aiuto per ricerca dettagli per soluzione #4

Closed giubri91 closed 4 years ago

giubri91 commented 4 years ago

Gentile SimoDax, grazie per aver creato questa guida sulle API di Trenitalia. Sto scrivendo un software in C# che aiuterà i non vedenti ed ipovedenti a navigare le soluzioni per delle tratte di viaggio in treno. Ti volevo chiedere aiuto circa l'ottenimento dei dettagli per una soluzione. Ho visto nella guida che specifichi:

ATTENZIONE: Funziona solo se la richiesta viene effetuata da un client che abbia già aperto una sessione con il sito, ad esempio facendo una ricerca soluzioni.

quindi ho provato a fare la richiesta subito dopo aver fatto la ricerca delle soluzioni.

Ho scritto questo codice per ottenere la lista delle soluzioni :

 string url = @"https://www.lefrecce.it/msite/api/solutions?origin=" + stazOrigine + "&destination=" + stazDest + 
            "&arflag=A&adate=" + dataAndata + "&atime=" + ora + 
            "&offset=0&adultno=1&childno=0&direction=A&frecce=false&onlyRegional=false";

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.AutomaticDecompression = DecompressionMethods.GZip;

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            using (Stream stream = response.GetResponseStream())
            using (StreamReader reader = new StreamReader(stream))
            {
                json = reader.ReadToEnd();
            }
 var result = JsonConvert.DeserializeObject<List<soluzioniPercorsoDeserialize>>(json);

ed ottengo le informazioni, adesso estraggo per ogni soluzione l'id ed eseguo la query da te segnalata nella guida.


   for (int i = 0; i < result.Count; i++)
                {
                for (int j = 0; j < result[i].trainlist.Count; j++)
                {
                    string solutionCurrentUrl = @"https://www.lefrecce.it/msite/api/solutions/"+result[i].idsolution+"/details";
                    request = (HttpWebRequest)WebRequest.Create(solutionCurrentUrl);
                    request.AutomaticDecompression = DecompressionMethods.GZip;
                    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                    using (Stream stream = response.GetResponseStream())
                    using (StreamReader reader = new StreamReader(stream))
                    {
                        jsonSolution = reader.ReadToEnd();
                    }
                    Console.WriteLine("SOLUZIONE "+i+"-esima: "+jsonSolution);
          }
}

però la query non viene eseguita, mi restituisce l'errore : 'System.Net.WebException' 
Mi sai suggerire una soluzione? io suppongo che come hai scritto tu le richieste devono essere successive (stessa sessione) e credevo di averlo fatto, ma evidentemente non è cosi, forse sbaglio metodo?
Ti ringrazio anticipatamente
SimoDax commented 4 years ago

Ciao, assicurati di abilitare la gestione dei cookie, le richieste devono condividerli proprio come un browser. Altrimenti se la seconda richiesta non invia i cookie sessione della prima sicuramente non funzionerà

giubri91 commented 4 years ago

Grazie mille per il suggerimento dei cookie, ho risolto il problema. Per chi ne avesse bisogno, ecco la soluzione che ho trovato, scritta in C#:

prima richiesta, lista soluziooni: qui imposto anche i cookie

            Uri site = new Uri(url); //url di ricerca 
            CookieContainer cookieContainer = new CookieContainer();
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(site);
            request.CookieContainer = cookieContainer;//imposto i cookie
            request.AutomaticDecompression = DecompressionMethods.GZip;

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                using (Stream stream = response.GetResponseStream())
                using (StreamReader reader = new StreamReader(stream))
                {
                    json = reader.ReadToEnd();
                }
            }
            var result = JsonConvert.DeserializeObject<List<soluzioniPercorsoDeserialize>>(json);

seconda richiesta di dettagli di una determinata soluzione: dove utilizzo i cookie della prima chiamata

                    Uri site2= new Uri(solutionCurrentUrl);//url contentente l'id soluzione di cui vogliamo avere i dettagli
                    HttpWebRequest request2 = (HttpWebRequest)WebRequest.Create(site2);
                    request2.CookieContainer = cookieContainer; //imposto i cookie uguali a quelli della prima chiamata
                    request2.AutomaticDecompression = DecompressionMethods.GZip;

                    using (HttpWebResponse response = (HttpWebResponse)request2.GetResponse())
                    {
                        using (Stream stream = response.GetResponseStream())
                        using (StreamReader reader = new StreamReader(stream))
                        {

                            jsonSolution = reader.ReadToEnd();
                        }
                    }
                    var dettagliSol = JsonConvert.DeserializeObject<List<dettagliSoluzioneDeserialize>>(jsonSolution);
SimoDax commented 4 years ago

Ottimo, io esplicito meglio sulla wiki la questione sessione e cookie