Autore Topic: Parametri in POST  (Letto 1210 volte)

Offline zodd

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Ideos
  • Sistema operativo:
    Windows Vista, Ubuntu 10.10, Windows 7
Parametri in POST
« il: 19 Maggio 2011, 00:24:43 CEST »
0
Salve a tutti, spiego subito il mio problema: devo realizzare un'applicazione che prende una "username" e una "password" e li invia in post ad un webservice REST. Ho creato il service con Jersey e l'ho testato con una pagina html in cui in una form inserivo i suddetti dati. il service riceve la richiesta, fa la query al db per trovare da username e password l'utente desiderato nella tabella UTENTE, ne estrae la matricola e la usa per cercare gli esami a lui relativi in una tabella ESAMI_SOSTENUTI di un db mysql,la risposta è un utente(con i sui dati presi dal db) e una lista di esami(presi dalla tabella ESAME) in json. Il mio problema è che una volta inseriti username e password nella mia app android non succede niente, compare solo android.app.Application e anche se fisso username e password dentro l'app come stringhe è lo stesso. Non so dove sbaglio, ho già realizzato una app che manda in post dei parametri, la differenza è che questa che funziona chiamava una pagina php che ho scritto su altervista e si appoggiava ad un db mysql sempre su altervista, quindi credo che il problema sia che ora il webservice gira in locale sulla mia macchina. Qualcuno sa dove sto sbagliando?
p.s.. usando l'emulatore, come indirizzo ip per la uri dove gira il service uso quello del pc che trovo facendo ipconfig, così evito il "localhost"
« Ultima modifica: 19 Maggio 2011, 09:36:28 CEST da zodd »

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +203
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Parametri in POST
« Risposta #1 il: 19 Maggio 2011, 09:49:14 CEST »
0
Prova ad inserire 10.0.2.2 come host
Citazione
10.0.2.2   Special alias to your host loopback interface (i.e., 127.0.0.1 on your development machine)
Using the Android Emulator | Android Developers

Offline zodd

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Ideos
  • Sistema operativo:
    Windows Vista, Ubuntu 10.10, Windows 7
Re:Parametri in POST
« Risposta #2 il: 19 Maggio 2011, 10:17:08 CEST »
0
mi da lo stesso errore, tra l'altro, come accadeva anche prima, ho l'impressione che quando premo invio per mandare i dati in post non invii proprio niente, perchè la risposta è troppo rapida. Quando invio i dati in post alla mia pagina php nell'app che funziona compare una finestra di dialogo con scritto connecting per un secondo circa e poi compare il risultato, qui invece vedo che contemporaneamente compare la finestra di dialogo "connecting" che dura un attimo, e dietro c'è già al posto del risultato android.app.Application. posto un po' di codice:
classe del server REST che gestisce la richiesta in post:
Codice (Java): [Seleziona]
@Path("/utente")
public class UtenteResource {
       
        /**
         * @return Le informazioni degli esami dell'Utente dato
         */

        @GET
        @Path("/{matricola}")
        @Produces("application/json")
        public Esami getEsame(@PathParam("matricola") Integer matricola) {
                Esami esami_sostenuti = new Esami();
                EsameDAO dao = ServiceLocator.getInstance().getEsameDAO();
                List<Esame> listEsame = null;
                try {
                        listEsame = dao.list( matricola );
                        esami_sostenuti.getEsami().addAll(listEsame);
                } catch (DAOException e) {
                        e.printStackTrace();
                       
                }
                return esami_sostenuti;
        }
       
        @POST
        @Produces("application/json")
        @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
        public Utente checkAuth(@FormParam("username") String username,
                        @FormParam("password") String password) {
               
                Utente user = null;
                List<Esame> esami = null;
                UtenteDAO dao = ServiceLocator.getInstance().getUtenteDAO();
                EsameDAO esame_dao = ServiceLocator.getInstance().getEsameDAO();
                try {
                        user = dao.login(username,password);
                        esami = esame_dao.list(user.getMatricola());
                        user.setEsami(esami);
                } catch (DAOException e) {
                        // In caso di errore ritorniamo un User che non ha id
                        e.printStackTrace();
                }
                return user;
        }
@POST
        @Produces("application/json")
        @Path("/esami")
        @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
        public Esami checkAuth2(@FormParam("username") String username,
                        @FormParam("password") String password) {
               
                Utente user = new Utente();
                List<Esame> esami = null;
                Esami esami_sostenuti = new Esami();
                UtenteDAO dao = ServiceLocator.getInstance().getUtenteDAO();
                EsameDAO esame_dao = ServiceLocator.getInstance().getEsameDAO();
                try {
                        user = dao.login(username,password);
                        esami = esame_dao.list(user.getMatricola());
                        esami_sostenuti.getEsami().addAll(esami);
                       
                } catch (DAOException e) {
                        // In caso di errore ritorniamo un User che non ha id
                        e.printStackTrace();
                }
                return esami_sostenuti;
        }
                       

}

ed ecco come lo chiamo, prima scrivo una classe di comodo:
Codice (Java): [Seleziona]
public class CustomApplication extends Application {

        private HttpClient httpClient;

        @Override
        public void onCreate() {
                super.onCreate();
                // Inizializziamo il riferimento all'HttpClient Thread Safe
                httpClient = createHttpClient();
        }
       
        @Override
        public void onLowMemory() {
                super.onLowMemory();
                // Rilasciamo le risorse del client
                releaseHttpClient();
        }

        @Override
        public void onTerminate() {
                super.onTerminate();
                // Rilasciamo le risorse del client
                releaseHttpClient();
        }

        /**
         * @return Il riferimento all'HttpClient ThreadSafe
         */

        public HttpClient getThreadSafeHttpClient() {
                return httpClient;
        }

        private final HttpClient createHttpClient() {
                /* Per creare il corrispondente ThreadSafeClientConnManager abbiamo
                bisogno delle informazioni relative al tipo di protocollo che
                intendiamo gestire. Nel nostro caso definiamo il supporto per l'HTTP
                attraverso la definizione di alcuni parametri e schemi */

                HttpParams httpParams = new BasicHttpParams();
                // Impostiamo la versione del protocollo HTTP alla 1.1
                HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);
                // Impostiamo il charset di default
                HttpProtocolParams.setContentCharset(httpParams,
                                HTTP.DEFAULT_CONTENT_CHARSET);
                /* Dobbiamo quindi descrivere i protocolli che intendiamo gestire associando
                a ciascuno uno schema ed una Factory delle connessioni Socket da usare */

                SchemeRegistry schemeRegistry = new SchemeRegistry();
                // Gestiamo il protocollo HTTP nella porta 80
                Scheme httpScheme = new Scheme("http",
                                PlainSocketFactory.getSocketFactory(), 80);
                schemeRegistry.register(httpScheme);
                // Creiamo il ThreadSafeClientConnManager e lo assegnamo al client
                ClientConnectionManager tsConnManager = new ThreadSafeClientConnManager(
                                httpParams, schemeRegistry);
                HttpClient tmpClient = new DefaultHttpClient(tsConnManager, httpParams);
                // restituiamo l'oggetto creato
                return tmpClient;
        }
       
        /*
         * Questo metodo permette di liberare le risorse occupate dal client ovvero
         * le diverse connessioni utilizzate. Per questo motivo andiamo a chiudere
         * le connessioni attraverso il ConnectionManager
         */

        private final void releaseHttpClient() {
                if (httpClient != null && httpClient.getConnectionManager() != null) {
                        // Se esiste il ConnectionManager del client lo chiudiamo
                        httpClient.getConnectionManager().shutdown();
                }
        }
}

e poi l'Activity:
Codice (Java): [Seleziona]
public class TesiStep2Activity extends Activity {
       
        //Identificativo della ProgressDialog di attesa
        private final static int WAITING_PROGRESS_DIALOG_ID = 1;
       
        //Indirizzo del server a cui accedere
        private final static String TARGET_URL = "http://[indirizzo_ip]/TesiStep2RestServer/utente/esami";
       
        // Riferimento all'Handler
        private Handler myHandler;
       
        // Riferimento alla ProgressDialog
        private ProgressDialog progressDialog;
       
        private String user;
        private String pass;
       
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                // Otteniamo il riferimento alle EditText di input
        final EditText username = (EditText)findViewById(R.id.username);
        final EditText password = (EditText)findViewById(R.id.password);
        // Otteniamo il riferimento alle TextView di output
        final TextView username_outputText = (TextView)findViewById(R.id.username_outputText);
        final TextView password_outputText = (TextView)findViewById(R.id.password_outputText);
        // Gestiamo il bottone
        Button okButton = (Button)findViewById(R.id.okButton);
        okButton.setOnClickListener(new OnClickListener(){

                        @Override
                        public void onClick(View arg0) {
                                // Leggiamo il valore inserito
                                Editable usernameText = username.getText();
                                Editable passwordText = password.getText();
                                // Esempio di aggiunta di testo a quanto ottenuto
                                //text.append(" Appended!");
                                // Lo inseriamo cone valore della TextView
                                username_outputText.setText(usernameText);
                                password_outputText.setText(passwordText);
                                user=usernameText.toString();
                                pass=passwordText.toString();
                               
                               
                        }});
           
        // Otteniamo il riferimento alla TextView
                final TextView outputView = (TextView) findViewById(R.id.outputView);
                myHandler = new Handler() {

                        @Override
                        public void handleMessage(Message msg) {
                                // Estrapoliamo il messaggio di testo dal msg
                                outputView.setText(msg.obj.toString());
                        }
                };
        }

        //Incapsula la logica di invio della richiesta Http
        public void sendHttpRequest(View button) {
                // Avviamo un Thread con il corrispondente codice di connessione
                Thread workerThread = new Thread(new Runnable() {

                        @Override
                        public void run() {
                                try {
                                        // Otteniamo il riferimento al HttpClient attraverso la
                                        // Application
                                        CustomApplication ca = (CustomApplication) getApplication();
                                        HttpClient httpClient = ca.getThreadSafeHttpClient();
                                        // Creiamo la HttpUriRequest relativamente al metodo POST
                                        HttpPost request = new HttpPost();
                                        // Impostiamo il valore dell'URI di destinazione
                                        URI targetUri = new URI(TARGET_URL);
                                        request.setURI(targetUri);
                                        // Impostiamo i corrispondenti parametri
                                        List<NameValuePair> postParameters = new ArrayList<NameValuePair>();
                                        postParameters.add(new BasicNameValuePair("username",user));
                                        postParameters.add(new BasicNameValuePair("password",pass));
                                        // Creiamo una Entity da inviare attraverso la request
                                        HttpEntity postEntity = new UrlEncodedFormEntity(postParameters);
                                        // La impostiamo nella request
                                        request.setEntity(postEntity);
                                        // A questo punto invochiamo il server
                                        httpClient.execute(request, myResponseHandler);
                                } catch (Exception e) {
                                        showMessageOnOutput(e.getMessage());
                                       
                                } finally {
                                        dismissDialog(WAITING_PROGRESS_DIALOG_ID);
                                }
                        }
                });
                // Visualizziamo una Dialog di attesa
                showDialog(WAITING_PROGRESS_DIALOG_ID);
                // Lo avviamo
                workerThread.start();
        }

        @Override
        protected Dialog onCreateDialog(int id) {
                switch (id) {
                case WAITING_PROGRESS_DIALOG_ID:
                        progressDialog = new ProgressDialog(this, ProgressDialog.STYLE_SPINNER);
                        progressDialog.setTitle("HTTP Connection");
                        progressDialog.setMessage("Connecting...");
                        progressDialog.setIndeterminate(true);
                        return progressDialog;
                default: return null;
                }
        }

        /**
         * Invia un messaggio all'Handler relativo al MainThread per la sua
         * visualizzazione nella TextView di output
         *
         * @param message
         *            Messaggio da visualizzare
         */

        private void showMessageOnOutput(String message) {
                Message messageToSend = myHandler.obtainMessage();
                messageToSend.obj = message;
                myHandler.sendMessage(messageToSend);
        }

        private final ResponseHandler<String> myResponseHandler = new ResponseHandler<String>() {

                @Override
                public String handleResponse(HttpResponse response)
                                throws ClientProtocolException, IOException {
                        // Estraiamo il risultato dalla risposta. Otteniamo quindi il
                        // content
                        // da cui leggere le informazioni
                        InputStream content = response.getEntity().getContent();
                                       
                        // Otteniamo il risultato
                        // //////////////// Json //////////////
                       
                        Gson gson = new Gson();
                        Reader r = new InputStreamReader(content);
                        Esami esami = new Esami();
                        try {
                                esami = gson.fromJson(r, Esami.class);
                        } catch (Exception e) {
                                Log.e("JSON_Parser", e.toString());
                        }
                        // ////////////////////////////
                        content.close();
                        String esamiString = esami.getSize().toString();
                        Iterator<Esame> it = esami.getEsami().listIterator();
                        while( it.hasNext() ) {
                                Esame esame = (Esame)it.next();
                                esamiString = esamiString+" codice : "+esame.getCodice()+" nome : "+esame.getNome()+" crediti : "+esame.getCrediti()+" ; ";
                        }
                       
                        String result ="Esami sostenuti da utente: "+esamiString;
                       
                        showMessageOnOutput(result);
                       
                        // Chiudiamo lo stream
                       
                        return result;
                       
                       
                };
               
       
};
}
dove ad [indirizzo_ip] c'è l'ip della mia macchina che trovo con ipconfig
in pratica sono quasi uguali alle classi usate nel libro di massimo carli, con l'aggiunta della parte su json trovata in un tutorial sul questo forum.
Può dipendere da come codifico i dati per inviarli? ho anche provato con
Codice (Java): [Seleziona]
HttpEntity postEntity = new UrlEncodedFormEntity(postParameters , HTTP.UTF_8);
« Ultima modifica: 19 Maggio 2011, 16:00:52 CEST da zodd »

Offline zodd

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Ideos
  • Sistema operativo:
    Windows Vista, Ubuntu 10.10, Windows 7
Re:Parametri in POST
« Risposta #3 il: 20 Maggio 2011, 18:11:43 CEST »
0
Alla fine in un modo o nell'altro ho arginato il problema, ho agganciato username e password alla stringa dell'url e così ho mandato il tutto in GET, chiaramente lato webservice ho dovuto creare un metodo che accettasse richieste in GET e accettasse i parametri username e password per fare la query.
Non metto topic risolto perchè in effetti il problema dell'invio in POST non l'ho ancora risolto
Aggiornamento:risolto anche per la POST, ho tolto la parte relativa la CustomApplication, cosa strana perchè ci avevo già provato..
« Ultima modifica: 20 Maggio 2011, 18:33:26 CEST da zodd »