Inviare richieste POST in Android

Mattepuffo's logo
Inviare richieste POST in Android

Inviare richieste POST in Android

Lo scenario è questo; per vedere il contenuto è obbligatorio eseguire il login, e le credenziali sono salvate sun un database remoto.

A seconda della risposta del server ci sarà un un messaggio di errore oppure verremo mandati all'activiy principale della app.

Il layout è abbastanza semplice:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <EditText
        android:id="@+id/txt_user"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dp"
        android:ems="10"
        android:inputType="text"
        android:text="" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/txt_pwd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/txt_user"
        android:layout_below="@+id/txt_user"
        android:layout_marginTop="24dp"
        android:ems="10"
        android:inputType="textPassword"
        android:text="" />

    <Button
        android:id="@+id/btn_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/txt_pwd"
        android:layout_below="@+id/txt_pwd"
        android:layout_marginTop="30dp"
        android:text="@string/btn_login" />

</RelativeLayout>

Si compone di un Button e due EditText.

 

Saltiamo all'activity:

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btnLogin = (Button) findViewById(R.id.btn_login);
        btnLogin.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                new AsyncConnection().execute("");
            }
        });
    }

    private class AsyncConnection extends AsyncTask<Object, Object, Object> {

        private String response = null;

        @Override
        protected Object doInBackground(Object... arg0) {
            Service s = new Service();
            try {
                EditText eu = (EditText) findViewById(R.id.txt_user);
                EditText ep = (EditText) findViewById(R.id.txt_pwd);
                String user = eu.getText().toString();
                String pwd = ep.getText().toString();
                response = s.login(user, pwd);
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Object result) {
            if (response.equals("1")) {
                Intent i = new Intent(MainActivity.this, BancaActivity.class);
                startActivity(i);
            } else {
                // ERRORE
            }
        }
    }

}

Un bel pò di cose da dire.

La cosa più rilevante è quella classe privata.

Per inviare richieste remote è obbligatorio (da non mi ricordo quale versione dell'API) fare un invio asincrono.

Ecco per quella classe che estende AsyncTask; come vedete questa classe la richiamiamo direttamente quando premiamo il Button.

Ci sono due metodi.

Il primo, doInBackGround, richiama la classe per inviare la richiesta (la vedremo dopo ovviamente).

Il secondo metodo viene eseguito in automatico alla fine del primo.

In pratica analizza la risposta del server: se è 1 ci manda ad una Activity, sennò darà un errore (che dovete gestire ad esempio con un AlertDialog).

Non è così complicato come potrebbe sembrare.

A questo punto vediamo la classe Service:

public class Service {

    private final String remote = "http://www.site.com/service/";
    
    public String login(String user, String pwd) throws ClientProtocolException, IOException {
        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(remote + "login.php");
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
        nameValuePairs.add(new BasicNameValuePair("user", user));
        nameValuePairs.add(new BasicNameValuePair("pwd", pwd));
        post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = client.execute(post);
        BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        String line;
        String result = null;
        while ((line = reader.readLine()) != null) {
            result = line;
        }
        reader.close();
        return result;
    }

}

Il tutto viene fatto nel metodo login che richiede due parametr (utente e password) che gli passiamo dalle EditText.

Con List<NameValuePair> impostiamo l'invio di due valori al server (che verranno raccoli con $_POST['user'] e $_POST['pwd'] nel caso del PHP).

Sotto leggiamo la risposta che poi verrà usata dal metodo onPostExecute.

Diciamo che c'è parecchia carne al fuoco, però non è nulla di particolarmente difficile.


Condividi

Commentami!