In particolare in questo post vedremo come creare un wrapper per eseguire connessioni tramite l'oggetto URLConnection.
Quella che vedremo di seguito è una classe di utilità per la gestione delle richieste http con parametri post e/o invio delle informazioni presenti nei cookies.
Ecco il codice sorgente della classe :
package util;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.io.OutputStreamWriter;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import util.entity.ResponseWrapper;
/***
* Classe di utilità per l'utilizzo delle connessioni mediante UrlConnection del package java.net
*
*/
public class ConnectionUtils {
/***
* Metodo per eseguire una chiamata http.
* Il metodo richiama un link, passandogli nell'header del pacchetto le informazioni sui parametri
* e le informazioni sui cookies.
* Dopo la chiamata http, recupera le informazioni dei cookies ed il contenuto html della risposta
* e li restituisce in un oggetto modellato per contenere tali informazioni.
*
* @param link : link da chiamare
* @param params : parametri post da passare
* @param cookiesToSend : cookies da inviare nell'header
* @return
*/
public static ResponseWrapper downloadPagePost(String link, Mapparams,List cookiesToSend) {
ResponseWrapper ouputRequest = null;
try {
URL url = new URL(link);
URLConnection conn = url.openConnection();
// mantiene la connessione anche dopo la richiesta
conn.setDoOutput(true);
conn.setRequestProperty("User-Agent","Java1.6 / "+System.getProperty("os.name")+" ("+System.getProperty("os.version")+")");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Cookie", CookiesUtils.getMyCookiesString(cookiesToSend));
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
String paramsEncoded = RequestUtils.getEncodedParameters(params);
wr.write(paramsEncoded);
wr.flush();
System.out.println("Call page : "+link);
String headerName = null;
Listcookiesretrieved = new ArrayList ();
for (int i = 1; (headerName = conn.getHeaderFieldKey(i)) != null; i++) {
// System.out.println("------------------");
// System.out.println("header : "+headerName);
// System.out.println("Content : "+conn.getHeaderField(i));
if (headerName.equals("Set-Cookie")) {
String cookie = conn.getHeaderField(i);
//System.out.println("cookie : "+cookie);
// Estraggo il cookie corrente e lo metto nella lista per il wrapper
String currCook = cookie.substring(0, cookie.indexOf(";"));
cookiesretrieved.add(currCook);
} //end if
}
StringBuffer output = new StringBuffer();
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = rd.readLine()) != null) {
output.append(line);
}
ouputRequest = new ResponseWrapper(output,cookiesretrieved);
} catch (Exception e) {
e.printStackTrace();
}
return ouputRequest;
}
}
In dipendenza a questa classe è necessario definire la classe ResponseWrapper :
package util.entity;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
public class ResponseWrapper {
private Listcookies;
private StringBuffer content;
public ResponseWrapper(StringBuffer acontent,Listcookin){
cookies = cookin;
content = acontent;
}
public ListgetCookies() {
return cookies;
}
public void setCookies(Listcookies) {
this.cookies = cookies;
}
public StringBuffer getContent() {
return content;
}
public void setContent(StringBuffer content) {
this.content = content;
}
public boolean writeToFile(String fileName){
FileWriter out;
try {
out = new FileWriter(fileName);
out.write(getContent().toString());
out.close();
} catch (IOException e) {
return false;
}
return true;
}
}
Questa classe è ha il compito di incapsulare le informazioni recuperate mediante la richiesta http, in particolare l'html contenuto e la lista di cookies generati dal sito.
Definiamo adesso un metodo per eseguire il login a cui passiamo username, password e cookies generati dal sito
public static boolean login(String username, String password,Listcookies){
Mapparametri = new HashMap ();
parametri.put("username",username);
parametri.put("password",password);
parametri.put("otherParam","param");
ResponseWrapper responseLogin = ConnectionUtils.downloadPagePost("mysite.org/login.php", parametri,cookies);
boolean loggedin = true ;// Here we can check login
// write html content to a file named checklogin.html
responseLogin.writeToFile("checklogin.html");
return loggedin;
}
Come utilizzare questo metodo ? Semplice :
Listcookies = new ArrayList ();
cookies.add("PHPSESSID=asd5nkl4nmnskdfjsidd=");
MySampleLogin.login("myUsr","myPasw",cookies);
Spero che la classe vi possa rendere le cose più semplici.
Alla prossima!