Newsgroup: it.comp.java
Titolo: Web Server in Java - POST method

ciaoo a tutti, sto scrivendo un web server in Java che funzioni per html e 
per servlets.
quando ho una pagina che passa i parametri con metodo GET, subito i 
parametri vengono subito ricevuti dal server e parsed (non so come si dice 
in italiano, forse scomposti?) in un HashMap.
problema: quando invece uso il metodo POST, devo cliccare due volte invece 
che una sul pulsante SUBMIT perche' il server lo riceva. sapete spiegarmi 
perche' e come ovviare a questo? (immagino ci sia una specie di autopostback 
o qualcosa di simile)
dopo avere letto gli headers della richiesta html, nel primo caso (GET) 
leggo i parametri dall'URI, nel secondo caso (post) leggo una nuova linea 
della richiesta html, per il resto tutto e' identico:
  if(method.equals("GET") && URI.contains("?")) // GET method
       paraLine = URI.substring(URI.indexOf("?")+1, URI.length());
  else // POST  method
       paraLine = in.readLine(); // in the POST request, the parameters are 
in the http request body
la pagina che manda la richiesta e':
<HTML>
<HEAD>
<BODY>
<FORM ACTION="/servlet/ThreeParams" METHOD="post">
 <INPUT TYPE=TEXT SIZE=30 NAME="Param1" VALUE="1"><br />
 <INPUT TYPE=TEXT SIZE=30 NAME="Param2" VALUE="2"><br />
 <INPUT TYPE=TEXT SIZE=30 NAME="Param3" VALUE="3"><br />
 <INPUT TYPE=SUBMIT>
</FORM>
<BODY>
-- 
ciao
Vittorix 

 invece che una sul pulsante SUBMIT perche' il server lo riceva.
aggiungo che anche se aggiorno la pagina o con un'altra richiesta GET il 
server continua il funzionamento.
e' come se il server debba ricevere un altro segnale dal client per andare 
avanti, non lo capisco.
-- 
ciao
Vittorix 

 che una sul pulsante SUBMIT perche' il server lo riceva.
A me intriga quel "paraLine = in.readLine()" nel codice.
Sicuro che tu debba leggere una "riga" ? C'e' un delimitatore di riga 
nello stream che ricevi ?

Giambo (26/01/2008 11.20.45):

In http sempre, il delimitatore di riga è composto da 0x0D 0x0A
indipendentemente dal sistema operativo, sia nella richiesta che nella
risposta (a meno che la risposta non sia contenuto binario). Questo è
tra l'altro specificato nella rfc 2616, pagina 15
http://www.rfc-editor.org/rfc/rfc2616.txt
-- 
Scientology: se la conosci la eviti, se la conosci non ti uccide...
http://xenu.com-it.net
 - 
http://xenu.freewinds.cx
 - 
http://www.xenu.net
(per rispondere personalmente leva IlDitoDalCulo)
---> 09 F9 11 02 9D 74 E3 5B D8 41 56 C5 63 56 88 C0 <---

 o qualcosa di simile)
Mah... a quanto mi risulta non esiste nulla del genere... provato a
stampare in console tutto ciò che arriva dal socket? magari il thread
sul tuo server che parsifica la POST rimane bloccata da qualche
parte...


 indipendentemente dal sistema operativo,
Appunto, nel caso sviluppi sotto UN*X, readLine() tornera' un CR di 
troppo a fine linea, no ? Se questo puo' essere il problema, non so 
dirlo :) ...

 troppo a fine linea
o uno in meno :)
-- 
ciao
Vittorix 

 Mah... a quanto mi risulta non esiste nulla del genere...
ho risolto:
usando read() invece che readLine():
  else if(method.equals("POST"))
                { // POST  method
                        int ch;
                        int len = Integer.parseInt((String)
headers.get("Content-Length")); // POST request Content-Length header
                        paraLine = "";
                        for(int i=1; i<=len; i++)
                        {
                            ch = in.read();
                            paraLine += (char) ch; // in the POST request,
the parameters are in the http request body
                        }
                }
-- 
ciao
Vittorix