2009-07-29 18 views
9

Qualcuno sa di un modo per ottenere solo i parametri POST da un oggetto HttpServletRequest?Recupera parametri POST solo (Java)

IE, PHP ha $ _POST superglobal e Perl's CGI.pm recupererà solo i parametri POST se il metodo HTTP è POST (per impostazione predefinita).

HttpServletRequest.getParameter (String) includerà i parametri URL GET anche se il metodo HTTP è POST.

+2

Come ho capito, si desidera solo i parametri nel corpo POST e NON i parametri dall'URL POST. – McDowell

+0

Esattamente. Questa è una descrizione più accurata. – dankuck

risposta

6

immagino un modo potrebbe essere quello di analizzare manualmente HttpServletRequest.getQueryString() e verificare che un parametro non è presente in essa.

Un'implementazione ingenuo (ignorando i valori chiave di tipo escape URL) sarebbe andato qualcosa di simile (non testata):

public boolean isInQuery(HttpServletRequest request, String key) { 
    String query = request.getQueryString(); 
    String[] nameValuePairs = query.split("&"); 
    for(String nameValuePair: nameValuePairs) { 
    if(nameValuePair.startsWith(key + "=")) { 
     return true; 
    } 
    } 
    return false; 
} 
+1

Questa è una soluzione davvero semplice. Tuttavia, questo suona come una soluzione. Mi chiedo se c'è qualche classe standard per fare il lavoro. Per i lettori, aggiungere questa riga all'inizio del metodo: chiave = URLEncoder.encode (chiave, "UTF-8"); – dankuck

+0

Ah, immagino che "soluzione alternativa" sia la parola sbagliata. Mi sembra sbagliato perché so che c'è del codice che fa qualcosa di molto simile nascosto da qualche parte lì dentro. – dankuck

+1

df menziona una classe chiamata ParameterParser nella classe HttpClient di Apache. Non è nella libreria standard di Java, ma almeno pensa a tutte le piccole cose che potremmo aver dimenticato qui. Quindi il codice potrebbe passare attraverso getParameterValues ​​() e ignorare quelli che hanno uno dei valori forniti da ParameterParser.parse(). – dankuck

8

Dalla mia comprensione, non ci sono cose come parametri POST e GET parametri in HTTP, ci sono metodi POST e GET. Quando viene effettuata una richiesta utilizzando il metodo POST, i parametri vanno all'interno del corpo del messaggio. In caso di una richiesta GET, i parametri vanno nell'URL.

mio primo pensiero fu che si trattava di un bug di implementazione nel servlet container. Ma, poiché le cose non sono sempre come ci si aspetta, la specifica del servlet java (almeno la versione 2.4) non distingue tra i due tipi di parametri. Quindi, non c'è modo di ottenere parametri post o url usando l'API servlet.

Sicuramente hai già un piano B. Ma, nel caso, vi posto due alternative che sono venute in mente:

  1. Se si ha accesso alla definizione nome del parametro, si potrebbe usare un prefisso per distinguere tra i due quando si itera il risultato getParameterNames().

  2. Si potrebbe analizzare l'URL creazione di un oggetto URL e utilizzando il metodo() getQuery per ottenere solo i parametri. Quindi analizzare i parametri sulla stringa di query utilizzando alcune classi di utilità come ParameterParser nella libreria HttpClient. Infine, sottrai i nomi dal risultato getParameterNames().

+0

Hmm ... Sto solo testando un'implementazione (Tomcat per Win32). Hai provato qualcun altro? – dankuck

+1

ParameterParser suona come il pacchetto perfetto per l'attività di identificazione di parametri e valori URL. Quindi qualcosa come il meccanismo nella risposta di ykaganovich potrebbe essere usato. – dankuck

3

Non poteva solo ottenere i parametri dal HttpServletRequest all'interno doPost o doGet in una sottoclasse di HttpServlet?

Tutto ciò che si afferra (tramite getParemeter) all'interno di doPost è un POST e qualsiasi cosa all'interno di doGet è un GET.

+0

Sto cercando di ignorare i parametri che vengono passati nell'URL. Questi sono inclusi da getParameter, indipendentemente dal metodo HTTP utilizzato. – dankuck

+1

Le richieste di posta possono avere entrambi i parametri GET e POST. Se è presente solo il parametro GET (ad esempio "nickname"), se fai request.getParameter ("nickname") all'interno di doPost, otterrai il parametro GET "nickname", che dovrebbe essere nullo dalla tua spiegazione. – Jamol

1

io non sono sicuro se questo avrebbe funzionato, ma si potrebbe provare a estrarre il contenuto grezzo del corpo POST utilizzando request.getReader(). Il contenitore potrebbe rimuovere tali dati prima di passare il controllo alla tua applicazione, anche se, anche se non fosse così, dovresti decodificare la stringa dei parametri da solo.

+0

Abbastanza divertente, sono più propenso a utilizzare le idee di arrotondamento suggerite sopra perché i dati POST hanno due diversi formati comuni (e un numero qualsiasi di altri). – dankuck

2

Penso che si possa fare qualcosa con getMethod() disponibile dall'interfaccia HttpServletRequest.

Java doc 1.6

Questo è disponibile in 1.4 e 1.5 anche.

+0

Questo non ti dirà nulla sulla fonte dei parametri. Ti dirà semplicemente quale metodo HTTP è stato utilizzato nella richiesta. – Yinzara

0

La questione è stata risolta in this related post:

Normalmente è possibile ottenere e parametri POST in un servlet allo stesso modo:

request.getParameter("cmd"); 

Ma solo se i dati POST è codificato come valore-chiave coppie di contenuti tipo: "application/x-www-form-urlencoded" come quando si utilizza un modulo HTML standard .