[Java] Inviare dati via HTTP POST

Il protocollo HTTP (Hypertext Transfer Protocol) è fra i più noti protocolli Internet. Il suo uso principale è quello di essere un mezzo per prelevare pagine HTML da mostrare in un browser.

HTTP è un protocollo di richiesta/risposta. Ci sono vari tipi di richieste effettuabili, ognuna delle quali viene identificata da un preciso metodo HTTP. I metodi più noti sono GET e POST.

Una richiesta di tipo POST spedisce dei dati (solitamente inseriti dall'utente in un form web) dopo aver specificato la pagina che analizza i dati spediti, il server, vari header e una linea bianca dopo quest'ultimi. Esempio:

POST /login.jsp HTTP/1.1
Host: www.mysite.com
User-Agent: Mozilla/4.0
Content-Length: 27
Content-Type: application/x-www-form-urlencoded

userid=chris&password=indovina

Invio richieste POST in Java

Qui di seguito il codice per inviare richieste POST ad un sito web in Java:


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

try{
url = new URL ("http://www.sito.com/pagina.php");
urlConn = url.openConnection();
urlConn.setDoInput (true);
urlConn.setDoOutput (true);
urlConn.setUseCaches (false);
urlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// spedisce al server i dati via POST
printout = new DataOutputStream (urlConn.getOutputStream());
String content = "username=" + URLEncoder.encode ("pippo","UTF-8") +
"password=" + URLEncoder.encode ("pippopass","UTF-8");
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);
}

8 comments:

Elvis ha detto...

grazie. l'ho usato e funziona.
una precisazione: nei dati di posting, serve un ampersand trale coppie chiave-valore (&).

Christian Castelli ha detto...

@Ops dimenticanza, grazie per la precisazione.

novizio ha detto...

ma su che sito l'avete provato?

Christian Castelli ha detto...

@novizio: va bene qualsiasi sito abbia un form in cui accetti dati via post. La cosa più semplice che puoi fare è crearti una pagina ad-hoc in locale per effettuare le tue prove.
Ciao!

novizio ha detto...

Perdonami, ma io proprio non ci riesco. sarà che ho sbagliato qualcosa di macroscopico...ad esempio se lo uso per provare a logarmi con il mio account su blogger mi da questo errore: java.io.IOException: Server returned HTTP response code: 405 for URL: https://www.blogger.com/
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
at URLDialog.main(URLDialog.java:70)

Christian Castelli ha detto...

@Novizio: non funziona con https. Provalo su un altro form. Vedi HTTP 405.

Paolo ha detto...

Proprio quello che cercavo :)
però ho ancora un problema, non conoscendo i nomi delle input (utente e password) c'è un qualche metodo che le recupera in java una volta connesso alla pagina web? purtroppo non le conosco perchè ogni volta che viene caricata la pagina cambiano.
qualcuno puo aiutarmi?

Christian Castelli ha detto...

@PaoloDevi parsarti il codice HTML e recuperare i nomi degli input. Ci saranno sicuramente classi, librerie o packages predisposti per questo senza che tu debba scrivere tutto da zero, fai qualche ricerca ;-)

Byte Strike Blog - Designed by Posicionamiento Web | Bloggerized by GosuBlogger