Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,091

    richiesta dati json filtrati da protezione civile

    Una discussione precedente mostra come ottenere un json dalla protezione civile per covid 19.

    Se si acquisiscono i dati e poi si filtrano ci si mette troppo tempo.

    Domanda: è possibile fare la richiesta passando un filtro? es http://xxxxx.json?regione=sardegna
    Pietro

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    1,275
    Quote Originariamente inviata da pietro09 Visualizza il messaggio
    Una discussione precedente mostra come ottenere un json dalla protezione civile per covid 19.

    Se si acquisiscono i dati e poi si filtrano ci si mette troppo tempo.

    Domanda: è possibile fare la richiesta passando un filtro? es http://xxxxx.json?regione=sardegna
    Ciao Pietro,
    dipende, se supporta o no odata.
    In pratica dovrebbe essere una query del tipo :
    codice:
    api/dati?$filter=Regione eq 'Sardegna'
    Si tratta di una tua risorsa oppure una esterna in cui non ci puoi mettere mano?

    EDIT:
    se si tratta di un .json la vedo difficile
    Ultima modifica di U235; 31-03-2020 a 17:45

  3. #3
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,091
    Ciao.
    Lavorando con Esri mi sono abituato a fare una richiesta json che restituisce un json, con la possibilità di filtraggio.
    Non avendo visto niente del sito protezione civile pensavo che qualcuno mi potesse dare una risposta.
    Forse ho poca banda, 0.3 Mbpz ma è che scaricare tutti i dati delle province italiane, quando a me ne servono 5, per poi filtrarli io, mi pare uno spreco

    Pietro

  4. #4
    Utente di HTML.it L'avatar di dwb
    Registrato dal
    Mar 2001
    residenza
    My IDE! :)
    Messaggi
    2,898
    Quote Originariamente inviata da pietro09 Visualizza il messaggio
    Una discussione precedente mostra come ottenere un json dalla protezione civile per covid 19.

    Se si acquisiscono i dati e poi si filtrano ci si mette troppo tempo.

    Domanda: è possibile fare la richiesta passando un filtro? es http://xxxxx.json?regione=sardegna

    Sarebbe molto utile, ma in questo momento immagino non sia possibile, almeno ufficialmente.
    Ultima modifica di djciko; 14-04-2020 a 14:57
    ~Il nome di una variabile deve riflettere il suo scopo e non il suo tipo di dati, NET Framework.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    1,275
    Quote Originariamente inviata da pietro09 Visualizza il messaggio
    Ciao.
    Lavorando con Esri mi sono abituato a fare una richiesta json che restituisce un json, con la possibilità di filtraggio.
    Non avendo visto niente del sito protezione civile pensavo che qualcuno mi potesse dare una risposta.
    Forse ho poca banda, 0.3 Mbpz ma è che scaricare tutti i dati delle province italiane, quando a me ne servono 5, per poi filtrarli io, mi pare uno spreco


    Mi sa che dovrai farti un semplice proxy.
    Visto che il problema sta nella velocità della tua (e perché no, anche di molti altri) connessione, potresti recuperare le tutte le info non filtrate dal sito una volta al giorno (tanto si tratta di informazioni al minimo giornaliere) tramite server e le serializzi, poi i client durante tutto il giorno possono accedere alle info filtrandole tranquillamente visto che a quel punto hai il totale controllo. In questo modo dovresti migliorare la situazione per le connessioni lente.
    Se lo vuoi fare e hai bisogno di una mano basta scrivere, non dovrebbe essere complicato comunque.

  6. #6
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,091
    Ho risolto rispolverando la Cache
    in un modulo ho messo:
    codice:
    Imports Microsoft.VisualBasic
    
    Public Module CacheFunzions
        'salva il riferimento all'oggetto Cache
        Dim Cache As System.Web.Caching.Cache = HttpRuntime.Cache
    
        Public Sub CacheStatisticheCOVID19()
            Dim s1 As String = "" 'dati ultimi province
            Dim s2 As String = "" 'dati storici province
            Dim url1 As String = "https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-json/dpc-covid19-ita-province-latest.json"
            Dim url2 As String = "https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-json/dpc-covid19-ita-province.json"
    
            Try
                Dim wc = New System.Net.WebClient()
                s1 = wc.DownloadString(url1)
                s2 = wc.DownloadString(url2)
    
            Catch ex As Exception
    
            Finally
    
            End Try
    
            Cache.Insert("covid19_province_ultimi", s1, Nothing, DateTime.Now.AddHours(1), Cache.NoSlidingExpiration, Caching.CacheItemPriority.Default, AddressOf OnRemoveItem)
            Cache.Insert("covid19_province_storici", s2, Nothing, DateTime.Now.AddHours(1), Cache.NoSlidingExpiration, Caching.CacheItemPriority.Default, AddressOf OnRemoveItem)
    
        End Sub
    
        Private Sub OnRemoveItem(key As String, value As Object, reason As CacheItemRemovedReason)
            'aggiorna sembre la cache
            CacheStatisticheCOVID19()
        End Sub
    End Module
    Nel Global.asax:
    codice:
    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        Application.Lock()
    
        'leggo le statistiche covid-19
        CacheStatisticheCOVID19()
    
        Application.UnLock()
    
    End Sub
    Mentre nel file che mostra le informazioni:
    codice:
    Dim s As String = NullToString(Cache("covid19_province_storici"))
    Pietro

  7. #7
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,091
    Mostra anche la tua soluzione, potrebbe essere interessante
    Pietro

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    1,275
    Ciao,
    mi pare la soluzione migliore la tua. Perlomeno se si tratta di letture tramite browser.
    La mia era una semplice webapi che ogni tot tempo fa una richiesta alla fonte di tutti i dati aggiornati ed eventualmente aggiunge dati in un db (o dove ti pare) che poi rilascia con la possibilità di filtraggio ai suoi client.
    In pratica: ad ogni richiesta alla webapi (mia diciamo) controllo il la data dell'ultima lettura dalla fonte dei dati, se necessario aggiorno i dati tramite json mettendoli in db, dopo restituisco i dati al chiamante filtrati dal mio db. Tutte le chiamate tranne quelle in cui sfortunatamente devi fare l'aggiornamento saranno più rapide, e tutte (quelle filtrate ovviamente) richiederanno meno banda tra il server e i vari client.

    EDIT:
    "Perlomeno se si tratta di letture tramite browser.". in realtà anche se non...
    Ultima modifica di U235; 03-04-2020 a 13:45

  9. #9
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,091
    A dire la verità ho sempre guardato con sospetto l'uso cella Cache in asp.net. Forse il suo uso dipende da problemi di IIE.
    Qui per esempio, ho dei dati assolutamente statici, tranne per il tempo, diciamo dalle 18:0 alle 19:0.

    Dato che sto a casa (come voi spero ) e qui ci passo il tempo (quando non lavoro in telelavoro), mi sto intestardendo a migliorare la questione. Magari facendo uso di una variabile statica che conserva il json, e una routine che in background richiama il json da remoto a intervalli di x minuti ma nel tempo di possibile variabilità, tipo 18-20

    ps. qui manca l'iconcina con la mascherina: è fondamentale, mettetela

    Pietro

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    1,275
    Ciao,
    ok... io però in genere preferisco scrivere codice riutilizzabile, quindi farò a modo mio.
    Ovviamente la prima cosa da fare è recuperare il json dal url di riferimento, ne copio un singolo elemento e lo incollo in visual studio tramite incolla speciale, in questo modo per chi non lo sapesse già (per eventuali posteri) ottengo la classe bella pronta, diciamo che la chiamiamo "Provinciale" (raccoglie i dati delle provincie).
    codice:
    [Table("Provinciale")]
            public class Provinciale : EntityBase
            {
                public DateTime data { get; set; }
                public string stato { get; set; }
                public int codice_regione { get; set; }
                public string denominazione_regione { get; set; }
                public int codice_provincia { get; set; }
                public string denominazione_provincia { get; set; }
                public string sigla_provincia { get; set; }
                public float lat { get; set; }
                public float _long { get; set; }
                public int totale_casi { get; set; }
                public string note_it { get; set; }
                public string note_en { get; set; }
            }
    EntityBase è una classe "di comodità", infatti aggiunge il campo Id necessario per il contesto dati. Inoltre uso l'attributo table per dare un nome alla tabella interna al file. Ultima nota è importante che erediti EntityBase per poterlo usare come tipo generico in ReaderContex.
    Una volta ottenuta la classe creo la web api e come sorgente dati uso EntityFramework core con SQLite, in modo da creare un file dati (basta cambiare la connessione e puoi utilizzare il db che ti pare se non vuoi usare un file).
    Esempio:
    codice:
    [Route("covid19/[controller]")]
        [ApiController]
        public class ProvincialeController : ControllerBase
        {
            const string URL = "https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-json/dpc-covid19-ita-province-latest.json";
            readonly string _databasePath = Path.Combine(Startup.contentRoot, "Provinciale.db");
            readonly ReaderContex<Provinciale> _context;
            public ProvincialeController()
            {
                _context = new ReaderContex<Provinciale>(_databasePath);
            }
            [HttpGet]
            [EnableQuery]
            public IQueryable<Provinciale> Get()
            {
                ReaderContex<Provinciale>.Update(URL, _databasePath, (ctx, lastUpdate, infoList) =>
                {
                    ctx.Info.RemoveRange(ctx.Info);//massimo qualche centinaio di record (forse un migliaio), diversamente: ctx.Database.ExecuteSqlCommand("DELETE FROM [Provinciale]");
                    ctx.Info.AddRange(infoList);
                    return true;
                });
                return _context.Info;
            }

    Qui in realtà non c'è molto... Creo appunto un ReaderContex<Provinciale>, questo dentro contiene tre tabelle, una per impostare un log che traccia tutte le chiamate fatte alla sorgente json, indicando data e esito della chiama (se ha fatto aggiornamento o no). Poi una seconda tabella che indica le fasce orarie (da tale ora a tale ora) e con che frequenza di tempo deve aggiornare in quella fascia oraria.
    Infine abbiamo la tabella delle info, che saranno quelle che verranno passate alla webapi. La struttura di quest'ultima ovviamente dipende dal tipo generico passato, in questo caso il tipo è "Provinciale".
    Nel metodo che fornisce i dati della webapi chiamiamo il metodo statico Update passando l'URL della sorgente json, il path del file db e una Function che mi passa il contesto dati, la data dell'ultimo aggiornamento, e i dati json appena letti (viene chiamato in base alle fasce orarie, e solo quando è necessario aggiornare i dati dalla fonte), a quel punto decidi tu cosa fare con i dati (ad esempio aggiungere solo gli ultimi record oppure cancelli i vecchi ed aggiungi i nuovi in modo che sei sicuro che sono sempre aggiornati anche i vecchi), infine restituisci true se ritieni che debba essere segnato il nuovo log (ultima chiamata fatta).


    Un altro esempio d'uso cambiando la struttura del json (uso il riepilogo nazionale):
    codice:
    [Route("covid19/[controller]")]
        [ApiController]
        public class NazionaleController : ControllerBase
        {
            const string URL = "https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-json/dpc-covid19-ita-andamento-nazionale.json";
            readonly string _databasePath = Path.Combine(Startup.contentRoot, "Nazionale.db");
            private readonly ReaderContex<Nazionale> _context;
            public NazionaleController(){ _context = new ReaderContex<Nazionale>(_databasePath);}
            [HttpGet]
            [EnableQuery]
            public IQueryable<Nazionale> Get()
            {
                ReaderContex<Nazionale>.Update(URL, _databasePath, (ctx, lastUpdate, infoList) =>{
                    ctx.Info.RemoveRange(ctx.Info);//massimo qualche centinaio di record, diversamente: ctx.Database.ExecuteSqlCommand("DELETE FROM [Nazionale]");
                    ctx.Info.AddRange(infoList);
                    return true;});return _context.Info;
            }
            [Table("Nazionale")]
            public class Nazionale : EntityBase
            {
                public DateTime data { get; set; }
                public string stato { get; set; }
                public int ricoverati_con_sintomi { get; set; }
                public int terapia_intensiva { get; set; }
                public int totale_ospedalizzati { get; set; }
                public int isolamento_domiciliare { get; set; }
                public int totale_positivi { get; set; }
                public int variazione_totale_positivi { get; set; }
                public int nuovi_positivi { get; set; }
                public int dimessi_guariti { get; set; }
                public int deceduti { get; set; }
                public int totale_casi { get; set; }
                public int tamponi { get; set; }
                public string note_it { get; set; }
                public string note_en { get; set; }
            }
        }
    Cambia ben poco come vedi... in realtà solo i vari path (del json e del file db) e ovviamente il tipo generato a partire dal json (puoi usare sostanzialmente qualsiasi json)
    Ora chiamando covid19/nazionale o covid/provinciale puoi (mettendo il nuget OData) utilizzare i filtri in querystring, tipo covid19/nazionale?$filter=Id eq 1.
    Mentre per gestire le fasce orarie e la relativa frequenza di aggiornamento aggiungi o rimuovi dal ReaderContex tipi TimeConfiguration, ognuna di esse è una singola fascia oraria.

    Nel prossimo post il codice di ReaderContex.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.