Newsgroup: it.comp.java
Titolo: Come mandare dei dati ad un CGI simulando un form di una pagina html?

Salve...
Ho realizzato il seguente programma (riportato per comodità alla fine)
Ma il server mi risponde dicendo che non trova il campo recipient...il
più importante.
Sicuramente sbaglio nel protocollo che per me è del tipo
POST /cgi-arethusalibri/formmail.cgi HTTP/1.0
Content-type: application/x-www-form-urlencoded
Content-length:  41
recipient=
rin...@flashnet.it
&tag1=valore1
DOVE Content-length:  41 contiene la lunghezza della stringa.
Vi prego di aiutarmi. Grazie!
package sms;
import java.awt.*;
import java.net.*;
import java.io.*;
public class sms {
  private String m="";
  private int test=1;
  public sms() {
  }//sms
  public void aggiungi(String tag,String v)
  {
    test=0;
    if(m.length()<=1)
        {
         m=tag+"="+v;
        }//if
    else
        {
        m+="&"+tag+"="+v;
        }//else
  }//funzione aggiungi
  public void invia()
  {
  String messaggio="";
  URL u=null;
  if(test==1)System.out.println("Devono essere inseriti ptima dei
parametri.");
  else{
    //messaggio="POST /cgi-arethusalibri/formmail.cgi
HTTP/1.0\r\nContent-type:
application/x-www-form-urlencoded\r\nContent-length:
"+m.length()+"\r\n\r\n"+m"\r\n";
    messaggio="POST /cgi-arethusalibri/formmail.cgi HTTP/1.0\r\n";
    messaggio+="Content-type: application/x-www-form-urlencoded\r\n";
    messaggio+="Content-length: "+m.length()+"\r\n\r\n";
    messaggio+=m+"\r\n";
    System.out.println(messaggio);
    //SPEDIZIONE DEL MESSAGGIO
      //connessione
      try
        {
        u=new
URL("
http://www.arethusalibri.com/cgi-arethusalibri/formmail.cgi
");
        }
      catch(Exception e)
        {
        System.err.println("\n\rERRORE NELLA COMUNICAZIONE URL");
        }
      try{
      System.out.println("0000");
      URLConnection uC=u.openConnection();
      System.out.println("11111");
      uC.setDoOutput(true);
      System.out.println("222222");
      uC.setDoInput(true);
      System.out.println("3333");
      uC.setAllowUserInteraction(false);
      DataOutputStream server=new
DataOutputStream(uC.getOutputStream());
      server.writeBytes(messaggio);
      server.close();
      //legge dal server
      DataInputStream in=new DataInputStream(uC.getInputStream());
      String ss;
      while((ss=in.readLine())!=null)
        {
        System.out.println(ss);
        }//while
        in.close();
      }//try
      catch(Exception e){System.out.println("ERRORE NEL SECONDO
TRY");}
    }//else
  }
  public static void main(String[] args) {
    sms vSms = new sms();
    vSms.aggiungi("recipient","
rin...@flashnet.it
");
    vSms.aggiungi("subject","MODULO ORDINAZIONI");
    vSms.aggiungi("inpumail1","proooova!");
    vSms.aggiungi("submit","PRENOTA");
    vSms.invia();
  }
}
/*
<form action="/cgi-arethusalibri/formmail.cgi" metod="post"
align="center">
  <input type="hidden" name="recipient"
value="
rin...@flashnet.it
"><input type="hidden"
  name="redirect"
value="
http://www.arethusalibri.com/risposta.htm
"><input type="hidden"
  name="subject" value="MODULO ORDINAZIONI"><p><input TYPE="text"
NAME="telefono1" VALUE
  SIZE="51" tabindex="2"></p>
  <p><input TYPE="text" NAME="mail1" VALUE SIZE="51"
tabindex="3">&nbsp;</p>
  <p><input TYPE="submit" NAME="PRENOTA" VALUE="PRENOTA"> <input
TYPE="reset" VALUE="Reset">
  </p>
</form>
*/

 Sicuramente sbaglio nel protocollo che per me è del tipo
Probabilmente sbagli le maiuscole/minuscole. "recipient" è differente da
"RECIPIENT" e da "Recipient" ai fini dell'invio di parametri ad una
servlet (verosimilmente anche uno script CGI). Ti consiglierei di
controllare l'esatta scrittura del nome del parametro recipient nella form
originale che invia i dati.
Ciao,
 Stefano
----------
"X WindowSSS, teSSSoro mio... lo odieremo per SSSempre"
Bill Gollum
----------


Secondo me il problema e' il seguente:
la stringa che spedisci al server non e' URL encoded.
Infatti la funzione aggiungi() non utilizza la classe java.net.URLEncoder
durante la creazione della stringa che viene inviata al server;
percio' quando formmail.cgi riceve la stringa e non trova il carettere '@'
all'internodel valore del campo recipient (si aspetta di trovarlo nel
formato "%xy"; vedi la documentazione della classe URLEncoder), suppone
che il valore inserito non sia un indirizzo e-mail valido e manda il
messaggio di errore.
Comunque per un'analisi piu' precisa del problema dovresti rendere noto
anche il messaggio di errore che ti arriva server.