PDA

View Full Version : Richieste HTTP Post in Java


Belox86
21-10-2010, 18:57
Ciao a tutti,
volevo sviluppare un programma java che, come da titolo, mi generi richieste HTTP con il metodo POST...
L'idea è quella di fare un programmino che si colleghi al sito ryanair e data una città di partenza e delle date di partenza e ritorno, mostri le migliori offerte per OGNI destinazione raggiungibile

Il sito ryanait utilizza, cm da titolo, il metodo POST per effettuare le richieste.
Googolando ho trovato (e modificato secondo le mie richieste...) questo codice ( l'originale lo trovate qui (http://bytestrike.blogspot.com/2008/05/java-inviare-dati-via-http-post.html) e sostanzialmente identico qui2 (http://www.hiteshagrawal.com/java/http-post-file-content-in-java)).

Per il momento il programma prende delle destinazioni e dati statiche, ma sarebbe facile estenderlo cm voluto...

ecco il codice:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URLEncoder;
import java.net.URL;
import java.net.URLConnection;
import java.io.DataOutputStream;
import java.io.DataInputStream;

class ControllaAerei {

public static void main (String args[]) {

URL url;
URLConnection urlConn;
DataOutputStream printout;
DataInputStream input;

try{
url = new URL ("http://www.bookryanair.com/SkySales/FRSearchRedirect.aspx?culture=it-it&lc=it-it");
urlConn = url.openConnection();
urlConn.setDoInput (true);
urlConn.setDoOutput (true);

// spedisce al server i dati via POST
printout = new DataOutputStream (urlConn.getOutputStream());
String content =
"travel_type=" + URLEncoder.encode ("on","UTF-8") +
"&SearchBy=" + URLEncoder.encode ("columenView","UTF-8") +
"&sector1_o=" + URLEncoder.encode ("aBGY","UTF-8") +
"&sector1_d=" + URLEncoder.encode ("BCN","UTF-8") +
"&sector_1_d=" + URLEncoder.encode ("29","UTF-8") +
"&sector_1_m=" + URLEncoder.encode ("112010","UTF-8") +
"&sector_2_d=" + URLEncoder.encode ("21","UTF-8") +
"&sector_2_m=" + URLEncoder.encode ("122010","UTF-8") +
"&ADULT=" + URLEncoder.encode ("1","UTF-8") +
"&CHILD=" + URLEncoder.encode ("0","UTF-8") +
"&INFANT=" + URLEncoder.encode ("0","UTF-8") +
"&mode=" + URLEncoder.encode ("0","UTF-8") +
"&pT=" + URLEncoder.encode ("1ADULT","UTF-8") +
"&oP=" + URLEncoder.encode ("","UTF-8") +
"&rP=" + URLEncoder.encode ("","UTF-8") +
"&nom=" + URLEncoder.encode ("2","UTF-8") +
"&date1=" + URLEncoder.encode ("20101129","UTF-8") +
"&date2=" + URLEncoder.encode ("20101221","UTF-8") +
"&m1=" + URLEncoder.encode ("20101129aBGYBCN","UTF-8") +
"&m2=" + URLEncoder.encode ("20101221BCNaBGY","UTF-8") +
"&m1DP=" + URLEncoder.encode ("0","UTF-8") +
"&m1DO=" + URLEncoder.encode ("0","UTF-8") +
"&m2DP=" + URLEncoder.encode ("0","UTF-8") +
"&m2DO=" + URLEncoder.encode ("0","UTF-8") +
"&pM=" + URLEncoder.encode ("0","UTF-8") +
"&tc=" + URLEncoder.encode ("1","UTF-8") +
"&language=" + URLEncoder.encode ("","UTF-8") +
"&culture=" + URLEncoder.encode ("it","UTF-8") +
"&module=" + URLEncoder.encode ("SB","UTF-8") +
"&page=" + URLEncoder.encode ("SELECT","UTF-8") +
"&BalearicUserAnswer=" + URLEncoder.encode ("NO","UTF-8") +
"&acceptTerms=" + URLEncoder.encode ("yes","UTF-8");

//System.out.println (content);

printout.writeBytes (content);
printout.flush ();
printout.close ();

// Stampa a video la risposta del server linea per linea
BufferedReader bufline = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
String str;
while (null != ((str = bufline.readLine()))) {
System.out.println (str);
}
bufline.close ();

}
catch(Exception e){
System.out.println("ERRORE: "+e);
}
}
}

Il programma genera effettivamente la richiesta ma genera una pagina di errore, cm se il sito ryanair non la accettasse..

Sono sicuro che i parametri POST sono giusti perchè utilizzando gli stessi con wget da terminale unix ottengo la pagina corretta...

wget "http://www.bookryanair.com/SkySales/FRSearchRedirect.aspx?culture=it-it&lc=it-it"
--post-data="
travel_type=on
&SearchBy=columenView
&sector1_o=aBGY
&sector1_d=BCN
&sector_1_d=29
&sector_1_m=112010
&sector_2_d=21
&sector_2_m=212010
&ADULT=1
&CHILD=0
&INFANT=0
&mode=0
&pT=1ADULT
&oP=
&rP=
&nom=2
&date1=20101129
&date2=20101221
&m1=20101129aBGYBCN
&m2=20101221BCNaBGY
&m1DP=0
&m1DO=0
&m2DP=0
&m2DO=0
&pM=0
&tc=1
&language=
&culture=it
&module=SB
&page=SELECT
&BalearicUserAnswer=NO
&acceptTerms=yes"
-O voli.html


Inoltro ho guardato i due pacchetti (quello generato da wget e quello generato dal programma java) con wireshark e la stringa contenente i parametri post è anch'essa identica...

Nom riesco a capire cosa ci sia di sbagliato nel programma java...

grazie in anticipo,
Michele

banryu79
22-10-2010, 09:14
Prova a esaminare l'header della risposta http e vedi se risponde con il codice di OK oppure altro... (non conosco wget) magari la risposta è un redirect?

Belox86
22-10-2010, 13:47
guardando le risposte http credo di aver capito quale sia il problema...
la risposta del server (che è sostanzialmente identica nei due casi) contiene un cookie, che con il comando wget viene ritrasmesso, mentre con il programma in Java no...
Adesso si tratta 'solo' di capire cm salvare e trasmettere il cookie con java....

banryu79
22-10-2010, 14:01
Useful link (http://download.oracle.com/javase/tutorial/networking/cookies/index.html) :D