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!
Commentami!