2009-07-29 17 views
9

¿Alguien sabe de una manera de obtener solo los parámetros POST de un objeto HttpServletRequest?Recuperar solo los parámetros POST (Java)

IE, PHP tiene el $ _POST superglobal y el CGI.pm de Perl solo recuperará los parámetros POST si el método HTTP es POST (de manera predeterminada).

HttpServletRequest.getParameter (String) incluirá los parámetros de URL GET, incluso si el método HTTP es POST.

+2

Según tengo entendido, solo desea los parámetros en el cuerpo POST y NO los parámetros de la URL POST. – McDowell

+0

Exactamente. Esa es una descripción más precisa. – dankuck

Respuesta

6

Supongo que una forma podría ser analizar manualmente HttpServletRequest.getQueryString() y comprobar que un parámetro no está presente en él.

Una implementación ingenua (ignorando los valores clave de escape de URL) sería algo como esto (no probado):

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

Esa es una solución realmente simple. Aún así, esto suena como una solución. Me pregunto si hay alguna clase estándar para hacer el trabajo. Para lectores, agregue esta línea al comienzo del método: clave = URLEncoder.encode (clave, "UTF-8"); – dankuck

+0

Ah, supongo que "solución alternativa" es la palabra incorrecta. Simplemente se siente mal porque sé que hay un código que hace algo muy similar escondido en algún lugar de allí. – dankuck

+1

df menciona una clase llamada ParameterParser en la clase HttpClient de Apache. No está en la biblioteca estándar de Java, pero al menos piensa en todas las pequeñas cosas que podríamos haber olvidado aquí. Entonces el código podría ir a través de getParameterValues ​​() e ignorar cualquiera que tenga uno de los valores dados por ParameterParser.parse(). – dankuck

8

Desde mi entender, no hay cosas tales como parámetros POST y GET parámetros de HTTP, hay son métodos POST y GET Cuando se realiza una solicitud utilizando el método POST, los parámetros van dentro del cuerpo del mensaje. En caso de una solicitud GET, los parámetros entran en la URL.

Lo primero que pensé fue que se trataba de un error de implementación en su contenedor de servlets. Pero, dado que las cosas no siempre son las esperadas, la especificación del servlet de Java (al menos la versión 2.4) no diferencia entre los dos tipos de parámetros. Por lo tanto, no hay forma de obtener los parámetros de publicación o URL con la API de servlet.

Seguramente ya tiene un plan B. Pero, por si acaso, he puesto dos alternativas que vinieron a mi mente:

  1. Si usted tiene acceso a la definición nombre del parámetro, se puede usar un prefijo para diferenciar entre los dos cuando itera el resultado getParameterNames().

  2. Puede analizar la URL creando un objeto URL y utilizando el método getQuery() para obtener solo los parámetros. A continuación, analice los parámetros en la cadena de consulta utilizando alguna clase de utilidad como ParameterParser en la biblioteca HttpClient. Y, por último, reste esos nombres del resultado getParameterNames().

+0

Hmm ... Solo estoy probando una implementación (Tomcat para Win32). ¿Has probado otros? – dankuck

+1

ParameterParser parece el paquete perfecto para la tarea de identificar los parámetros y valores de URL. Entonces algo como el mecanismo en la respuesta de Ykaganovich podría ser usado. – dankuck

3

No se pudo conseguir que acaba de los parámetros de la HttpServletRequest dentro doPost o doGet en una subclase de HttpServlet?

Cualquier cosa que agarres (a través de getParemeter) dentro de doPost es un POST y cualquier cosa dentro de doGet es un OBJETIVO.

+0

Estoy tratando de ignorar los parámetros que se pasan en la URL. Esos están incluidos por getParameter sin importar qué método HTTP se use. – dankuck

+1

Las solicitudes de envío pueden tener los parámetros GET y POST. Si solo está presente el parámetro GET (digamos "apodo"), entonces si solicita.getParameter ("apodo") dentro de doPost, obtendrá el parámetro GET "apodo", que debería ser nulo en su explicación. – Jamol

1

No estoy seguro de si esto funcionaría, pero podría intentar extraer el contenido sin procesar del cuerpo POST usando request.getReader(). Sin embargo, el contenedor puede eliminar esa información antes de darle control a su aplicación, y aunque no fuera así, tendría que decodificar la cadena de parámetros usted mismo.

+0

Bastante curioso, estoy más inclinado a usar las ideas de aproximación sugeridas anteriormente porque los datos POST tienen dos formatos comunes diferentes (y cualquier cantidad de otros). – dankuck

2

Creo que podría hacer algo con getMethod() disponible desde la HttpServletRequest Interface.

Java doc 1.6

Esto también está disponible en 1.4 y 1.5.

+0

Eso no le dirá nada sobre el origen de los parámetros. Simplemente le dirá qué método HTTP se utilizó en la solicitud. – Yinzara

0

La pregunta fue respondida en this related post:

Normaly que se ofrecen y parámetros POST en un servlet de la misma manera:

request.getParameter("cmd"); 

Pero sólo si los datos POST se codifica como clave-valor pares de contenido tipo: "application/x-www-form-urlencoded" como cuando usa un formulario estándar HTML.

Cuestiones relacionadas