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") +
"§or1_o=" + URLEncoder.encode ("aBGY","UTF-8") +
"§or1_d=" + URLEncoder.encode ("BCN","UTF-8") +
"§or_1_d=" + URLEncoder.encode ("29","UTF-8") +
"§or_1_m=" + URLEncoder.encode ("112010","UTF-8") +
"§or_2_d=" + URLEncoder.encode ("21","UTF-8") +
"§or_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
§or1_o=aBGY
§or1_d=BCN
§or_1_d=29
§or_1_m=112010
§or_2_d=21
§or_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
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") +
"§or1_o=" + URLEncoder.encode ("aBGY","UTF-8") +
"§or1_d=" + URLEncoder.encode ("BCN","UTF-8") +
"§or_1_d=" + URLEncoder.encode ("29","UTF-8") +
"§or_1_m=" + URLEncoder.encode ("112010","UTF-8") +
"§or_2_d=" + URLEncoder.encode ("21","UTF-8") +
"§or_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
§or1_o=aBGY
§or1_d=BCN
§or_1_d=29
§or_1_m=112010
§or_2_d=21
§or_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