Autore Topic: Lettura dati su database remoto con app android  (Letto 1083 volte)

Offline ridaria

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    huawei
  • Sistema operativo:
    windows 7
Lettura dati su database remoto con app android
« il: 01 Dicembre 2017, 10:22:36 CET »
0
Buongiorno,

Mi dareste delle indicazioni di base tutorial o altro da cui partire per implementare questa procedura.

Dovrei leggere dei dati da un database residente su server web, e mostrarli a video in una APP android.

GRAZIE

Offline berpao

  • Utente normale
  • ***
  • Post: 160
  • Respect: +20
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Lettura dati su database remoto con app android
« Risposta #1 il: 01 Dicembre 2017, 14:10:49 CET »
0
Ciao,
dando per scontato che il suddetto server web fornisca delle api da richiamare con una richiesta HTTP (webapi restful o web service che sia), l'idea di base è creare una richiesta http e gestirne il risultato) io per le richieste in android uso questa libreria che mi facilita il compito (è ben documentata, se segui gli esempi non dovresti avere difficoltà). Per la gestione del risultato dipenda cosa ti arriva indietro (json, xml, ecc), cmq anche li ci sono librerie che ti facilitano il compito , per esempio per json io uso le librerie interen di android (eccole qui).
Se vuoi maggiori dettagli dovremmmo entrare un po' di più nella situazione e avere maggiori informazioni su quello che devi fare ma sopratutto su quello che puoi fare (hai accesso al server? puoi sviluppare del codice da pubblicare su questo server? ecc ecc)
Fammi sapere
Paolo

Offline ridaria

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    huawei
  • Sistema operativo:
    windows 7
Re:Lettura dati su database remoto con app android
« Risposta #2 il: 01 Dicembre 2017, 17:31:33 CET »
0
GRAZIE :)


Certo che ho accesso al server.


Unica cosa che penso possa generare problemi è che è uno spazio web Microsoft, e cioè posso scrivere codice dot.net, con cui comunque già mi interfaccio con il database in questione che è MySQL.


Resto in attesa.


Grazie








Offline berpao

  • Utente normale
  • ***
  • Post: 160
  • Respect: +20
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Lettura dati su database remoto con app android
« Risposta #3 il: 04 Dicembre 2017, 08:13:36 CET »
0
Ciao, perchè pensi possa generare problemi? quali sono i tuoi dubbi? Dal punto di vista dell'app android non cambia niente se la pagina http che chiami è scritta in .net, java, php o qualsiasi altro linguaggio server-side; per l'app è una richiesta normalissima. Fammi sapere che dubbi hai, così magari li chiariamo...
Ciao
P

Offline ridaria

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    huawei
  • Sistema operativo:
    windows 7
Re:Lettura dati su database remoto con app android
« Risposta #4 il: 04 Dicembre 2017, 11:23:29 CET »
0
Ok, perfetto, allora dubbi non ne ho! :-)

Quindi possiamo avviarci in questo cammino. ( se sei disposto a darmi un pò di supporto)

Ti anticipo che sono un programmatore dot.net, sviluppo applicativi lato server web e desktop.

e mi sto appena avvicinando alla programmazione per android.
e per cominciare, vorrei creare una app da distribuire ad alcuni miei clienti con la quale possono leggere dei dati di vendita che sono appunto immagazzinati su un database residente su server web come ti avevo già anticipato.

Android Studio è installato e funzionante ;-), ed ho anche scritto un pò di codice funzionante.

Resto in attesa e GRAZIE




Offline berpao

  • Utente normale
  • ***
  • Post: 160
  • Respect: +20
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Lettura dati su database remoto con app android
« Risposta #5 il: 04 Dicembre 2017, 13:45:10 CET »
0
Ciao, no problem per il supporto, io sono qui...  :-)
Ciao
P

Offline ridaria

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    huawei
  • Sistema operativo:
    windows 7
Re:Lettura dati su database remoto con app android
« Risposta #6 il: 04 Dicembre 2017, 15:17:56 CET »
0
OK da dove parto?
Devo creare un web service sul web che accede al DB e legge i dati interessati?
Cosa deve restituire un file xml ? Giusto?

Offline berpao

  • Utente normale
  • ***
  • Post: 160
  • Respect: +20
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Lettura dati su database remoto con app android
« Risposta #7 il: 04 Dicembre 2017, 17:36:26 CET »
0
Ciao, si io partirei da li. Diciamo che come crearlo dipende da come è fatto il sito lato web. In generale se hai un sito scritto usando il framework asp.net MVC (dalla versione 4 in poi) allora potresti aggiungere le web api al progetto e partire da li.
 Altrimenti potresti optare per un web service soap o una pagina/chiamata web (in get presumo), diciamo che bene o male le opzioni potrebbero essere queste. Per la risposta, io userei json che è più leggero e cmq android ha delle librerie che ti permettono di manipolarlo, poi vedi tu se sei più avvezzo con l'xml usa quello
Ti consiglio inoltre di definirti una classe per le risposte in modo che tutte le risposte ricevute abbiamo la stessa struttura; i questo modo se hai bisogno di più chiamate che servano a scopi diversi, tutte le risposte saranno identiche strutturalmente parlando.
Io per esempio mi sono creato questa per un progetto in c# (non è il top dell'ingegneria software ma fa il suo dovere):

Codice (Java): [Seleziona]
    public class WebApiResponse {

        public DateTime Timestamp {
            get {
                return this._timeStamp;
            }
        }

        public String Executor {
            get {
                return this._executor;
            }
        }

        public String DeviceId {
            get {
                return this._deviceId;
            }
        }

        public bool ErrorOccurred {
            get {
                return this._errorOccurred;
            }
        }

        public Object ResponseContent {
            get {
                return this._responseContent;
            }
        }

        public String ResponseException {
            get {
                return this._responseException;
            }
        }


        //public String DeviceId { get; set; }
        private DateTime _timeStamp = DateTime.Now;
        private string _deviceId = null;
        private string _executor = null;
        private bool _errorOccurred = false;
        private object _responseContent = null;
        private String _responseException = null;


        public static WebApiResponse createResponse(string deviceId, string executor, object response) {
            WebApiResponse result = null;

            try {
                result = new WebApiResponse();
                result._timeStamp = DateTime.Now;
                result._deviceId = deviceId;
                result._executor = executor;

                if (response is Exception) {
                    result._errorOccurred = true;
                    result._responseContent = null;
                    result._responseException = ((Exception)response).Message;
                } else {
                    result._errorOccurred = false;
                    result._responseContent = response;
                    result._responseException = null;
                }

               
            } catch (Exception ex) {
                result._timeStamp = DateTime.Now;
                result._deviceId = deviceId;
                result._executor = executor;
                result._errorOccurred = true;
                result._responseContent = null;
                result._responseException = ((Exception)response).StackTrace;
            }

            return result;
        }

        public static WebApiResponse createResponse(string executor, object response) {
            WebApiResponse result = null;

            try {
                result = new WebApiResponse();
                result._timeStamp = DateTime.Now;
                result._deviceId = null;
                result._executor = executor;

                if (response is Exception) {
                    result._errorOccurred = true;
                    result._responseContent = null;
                    result._responseException = ((Exception)response).Message;
                } else {
                    result._errorOccurred = false;
                    result._responseContent = response;
                    result._responseException = null;
                }


            } catch (Exception ex) {
                result._timeStamp = DateTime.Now;
                result._deviceId = null;
                result._executor = executor;
                result._errorOccurred = true;
                result._responseContent = null;
                result._responseException = ((Exception)response).StackTrace;
            }

            return result;
        }
    }

tutte le mie richieste mi restituiscono in formato json una rappresentazione di questa classe.
Fatto questo e verificato con un client tipo postmand che la chiamata si comporta come dovrebbe, passiamo alla parte android
Ciao
P
« Ultima modifica: 04 Dicembre 2017, 17:42:11 CET da berpao »

Offline ridaria

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    huawei
  • Sistema operativo:
    windows 7
Re:Lettura dati su database remoto con app android
« Risposta #8 il: 11 Dicembre 2017, 19:03:50 CET »
0
Ok GRAZIE

il web service lo ho creato e mi restituisce un valore Json:

{TOTALE:570,2,TotVendita:387,totConsig:183,2}

Da qui puoi vedere il risultato direttamente.
http://www.prezyparrucchieri.com/amministrazione/prova.aspx

è corretto fin qui?

GRAZIE


Offline capitancooker

  • Utente junior
  • **
  • Post: 123
  • Marco
  • Respect: +10
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    macOS High Sierra
Re:Lettura dati su database remoto con app android
« Risposta #9 il: 11 Dicembre 2017, 20:43:29 CET »
0
Ciao, mi intrometto per rispondere direttamente alla tua domanda. Il Json non è corretto, sia per forma che per contenuto.
I campi vanno racchiusi tra virgolette, i decimali indicati con un punto, ma soprattutto il content-type del documento deve essere praticamente un file di testo (application/json) e non un html.
Quello che riceve android dopo una chiamata all'url che hai indicato è questo:
Codice (Java): [Seleziona]
{TOTALE:606,2,TotVendita:399,totConsig:207,2}

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>

</title></head>
<body>
    <form name="form1" method="post" action="prova.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE2MTY2ODcyMjlkZBUOMnAFpXop9v9pCRfdMIW85lb4" />
</div>

<div>

        <input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="81902F7F" />
</div>
    <div>
   
    </div>
    </form>
</body>
</html>

mentre deve essere così (e il content-type "application/json")
Codice (Java): [Seleziona]
{"TOTALE":570.2,"TotVendita":387,"totConsig":183.2}
Ti suggerisco i usare tools di controllo delle chiamate http come Postman https://www.getpostman.com/postman che ti analizza in dettaglio il risultato, così non perdi tempo dopo a capire perché non ti funziona nell'app.

Ciao,
Marco
« Ultima modifica: 11 Dicembre 2017, 20:45:47 CET da capitancooker »
Se sbaglio, correggetemi.

Offline berpao

  • Utente normale
  • ***
  • Post: 160
  • Respect: +20
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Lettura dati su database remoto con app android
« Risposta #10 il: 12 Dicembre 2017, 08:03:24 CET »
0
Ciao, concordo con quanto scritto da Marco. Aggiungo inoltre che il JSon non c'è bisogno che lo crei tu, esistono delle classi anche per .net che ti permette di serializzare un oggetto in formato json, producendo un risultato formalmente corretto. Non impazzire dietro la generazione del Json. Quello che uso io è JSon.Net della newtonsoft che puoi installare anche tramite nuget come dice qui
Inoltre, se ti retituisce l'html insieme al json c'è qualcosa che non va lato server; ricorda che la pagina deve restituire un content type di tipo application/json, come evidenziato da Marco, e non text/html che dovrebbe essere il default.
Ciao
P

Post unito: [time]12 Dicembre 2017, 08:30:37 CET[/time]
Ciao, aggiungo un link di SO dove viene spiegato come farsi restituire un json da un web service se usi i Web forms

Eccolo

Ciao
P
« Ultima modifica: 12 Dicembre 2017, 12:20:53 CET da berpao, Reason: Merged DoublePost »

Offline ridaria

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    huawei
  • Sistema operativo:
    windows 7
Re:Lettura dati su database remoto con app android
« Risposta #11 il: 17 Dicembre 2017, 09:52:12 CET »
0
Grazie per l'attenzione.

è chiaro che mi restituisce anche l'HTML

quella che chiamiamo è una pagina HTML che restituisce la stringa e chiaramente il suo default (HTML).

il web Method è questo:

 <WebMethod()> _
     <ScriptMethod(ResponseFormat:=ResponseFormat.Json)> _
    Public Function GetTotali() As String

        Dim clsGenerale As New Generale
                   
        Dim strTotali As String = clsGenerale.TOTALEPuntoVendita_Click("Buonvento14")
     

        Dim js As JavaScriptSerializer = New JavaScriptSerializer()
        Dim sJSON As String = js.Serialize(strTotali)
        Return sJSON

    End Function

che io chiaramente richiamo con una pagina aspx che restituisce content Type HTML.

Ecco perché sono qui a chiedervi:

Come richiamo da ANDROID il web method che vi ho indicato e che fisicamente sta QUI:

   WebServiceTotali Servizio Web


GRAZIE, andiamo per gradi ragazzi grazie ancora


Post unito: 17 Dicembre 2017, 10:07:37 CET
scusatemi:

sta qui: "http://www.prezyparrucchieri.com/WebServiceTotali.asmx"
« Ultima modifica: 17 Dicembre 2017, 10:07:38 CET da ridaria, Reason: Merged DoublePost »

Offline berpao

  • Utente normale
  • ***
  • Post: 160
  • Respect: +20
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Lettura dati su database remoto con app android
« Risposta #12 il: 18 Dicembre 2017, 08:37:55 CET »
0
Ciao, innanzitutto ho provato ad aprire le url (entrambe) che hai scritto ma ricevo un 404, quindi credo che l'url sia sbagliata.
Per la chiamata da andorid puoi fare riferimento alla libreria che ti ho indicato nel mio primo post e che ti riscrovo qui LINK LIBRERIA. Con questa libreria puoi costruire via codice java una chiamata http (get, post o qualunque metodo ti serva) per poi gestirne il risultato. E' facile da usare nella home page del sito c'è un esempio base da cui puoi partire e modificarlo in base alla tua esigenza, te lo riscrivo qui

1) aggiungere al progetto android nel file build.gradle del modulo, il caricamento della libreria

Codice: [Seleziona]
dependencies {
  compile 'com.loopj.android:android-async-http:1.4.9'
}

2) referenziare nella tua classe la libreria

Codice (Java): [Seleziona]
import com.loopj.android.http.*;
3) Usare la libreria

Codice (Java): [Seleziona]
AsyncHttpClient client = new AsyncHttpClient();
client.get("https://www.google.com", new AsyncHttpResponseHandler() {

    @Override
    public void onStart() {
        // called before request is started
    }

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] response) {
        // called when response HTTP status is "200 OK"
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
        // called when response HTTP status is "4XX" (eg. 401, 403, 404)
    }

    @Override
    public void onRetry(int retryNo) {
        // called when request is retried
        }
});

Come vedi, nelcodice l'istruzione "client.get()" esegue una richiesta GET verso una url (primo parametro passato, che è "https://www.google.com"). Il secondo parametro è una interfaccia che definisce dei listener per gli eventi sollevati dalla chiamata GET; se la chiamata va in errore verrà eseguito il metodo "onFailure", se avrà successo la "onSuccess". Ovviamente devi modificare i vari listenere per fare quello che ti serve (per esempio nella onSuccess dovresti mettere il codice per leggere il tuo json ritornato dalla chiamata al tuo web service)
Fammi sapere come va
Ciao
P

Offline maverik1408

  • Utente junior
  • **
  • Post: 101
  • Respect: +2
    • Mostra profilo
    • MaverikApps
  • Dispositivo Android:
    NEXUS 5
  • Play Store ID:
    Maverik
Re:Lettura dati su database remoto con app android
« Risposta #13 il: 18 Dicembre 2017, 10:34:55 CET »
+1
provaa a vedere anche evenbus / retrofit
Maverik @ Google Play Store

Offline berpao

  • Utente normale
  • ***
  • Post: 160
  • Respect: +20
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Lettura dati su database remoto con app android
« Risposta #14 il: 18 Dicembre 2017, 12:15:58 CET »
0
provaa a vedere anche evenbus / retrofit

Ciao,
sembra interessante, questa serve anche a me
Grazie
P