Home / Programmazione / Java / Invio di richieste POST in Java
Mattepuffo

Invio di richieste POST in Java

Invio di richieste POST in Java

Lo scenario è questo: controllare le credenziali che si trovano su un db, e in base alla risposta riempire o meno una JTable.

Per prima cosa dobbiamo avere uno o più file in PHP sul server remoto.

Io interrogo questo file qua:

<?php

require_once 'config.php';

$db = new Database();
$db->login($_POST['user'], $_POST['pwd']);

Nel file config.php c'è la classe per la connessione.

Sotto istanzio la classe e richiamo il metodo login passando user e password in POST.

Se trovo la combinazione user e password, login mi restituisce 1, altrimenti 0.

Non mi soffermo molto sulla parte in PHP in quanto si tratta praticamente di un login normale; l'unica cosa che dovete tenere a mente è il nome che date ai $_POST.

A questo punto partiamo con Java.

 

Questa la classe che si occupa di inviare i dati in POST:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.security.NoSuchAlgorithmException;

public class Login {

    public static boolean doLogin(String user, String pwd) throws IOException, NoSuchAlgorithmException {
        String data = "user=" + URLEncoder.encode(user, "UTF-8") + "&pwd=" + URLEncoder.encode(pwd, "UTF-8");
        URL url = new URL("http://www.site.com/login.php");
        URLConnection urlConn = url.openConnection();
        urlConn.setDoOutput(true);
        try (OutputStreamWriter writer = new OutputStreamWriter(urlConn.getOutputStream())) {
            writer.write(data);
            writer.flush();
        }
        String result = null;
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream()))) {
            String line;
            while ((line = reader.readLine()) != null) {
                result = line;
            }
        }
        return result.equals("1") ? true : false;
    }
}

Prima di tutto considerate che uso strumenti presi da Java 7 (il try-with-resource nel caso specfico).

Al metodo statico doLogin passiamo due String, che rappresentano username e password da inviare.

Considerate che io qua non ho cripato la password, ma andrebbe fatto!!!

Poi imposto i dati da inviare, stando attento a impostare la stessa codifica che ho sul db (in questo caso UTF-8).

Richiamo il file login.php attraverso un oggetto URL, apro la connessione e imposto di inviargli i dati attraverso URLConnection.

Poi uso OutputStreamWriter per inviare/scrivere i dati nello stream.

Subito sotto leggo la risposta che mi invia il server usando un BufferedReader insieme a InputStreamReader.

A seconda del valore (0 o 1) restituisco TRUE o FALSE.

A questo punto nel mio JFrame ho questo metodo:

private void createConnection() {
            char[] pwd = txtPwd.getPassword();
            String strPwd = new String(pwd);
            try {
                if (Login.doLogin(txtUser.getText(), strPwd)) {
                      // DO STUFF
                } else {
                    JOptionPane.showMessageDialog(null, "No connection or incorrect username and password");
                }
            } catch (IOException | NoSuchAlgorithmException ex) {
                JOptionPane.showMessageDialog(null, ex.getMessage());
            }
    }

Questo lo richiamo ad esempio su un JButton.

Richiamo il metodo statico visto sopra passandogli i valori di una JTextField e di un JPasswordField.

Se mi viene restituio TRUE allora eseguo le operazioni (nel mio caso sarà riempire un JTable con i dati presi dal database).

Attenzione che io uso il multi-catch, altra cosa presa da Java 7!