2011-12-28 21 views
6

Estoy usando Netty, y tengo que aceptar y analizar las solicitudes HTTP POST. Por lo que puedo decir, Netty no tiene soporte integrado para POST, solo GET. (Es una biblioteca de bajo nivel que trata con operaciones primitivas de red. Usar un contenedor de servlets, que hace todo esto de manera predeterminada, no es una opción).¿Cómo decodificar datos de POST HTTP en Java?

Si tengo el contenido de una solicitud POST como un conjunto de bytes, ¿cuál es la forma más rápida y libre de errores de analizarlo en un Mapa de parámetros?

Podría escribir esto yo mismo, pero hay debe ser algunos métodos incorporados en el JDK que hacen esto más fácil. Y apostaría a que hay algunos problemas y casos de esquina con los que lidiar.

+0

¿Puedes dar el código de muestra de lo que estás tratando de hacer? – mossplix

Respuesta

13

Netty tiene un avanzado decodificador solicitud POST (HttpPostRequestDecoder) que puede decodificar Http atributos, contenido FileUpload con la codificación fragmentada vistazo a la fuente de Tomcat en cómo han aplicado processParameters().

Aquí es una forma sencilla decodificación ejemplo

public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { 
    HttpRequest request = (HttpRequest) e.getMessage(); 
    HttpPostRequestDecoder decoder = new HttpPostRequestDecoder(new DefaultHttpDataFactory(false), request); 

    InterfaceHttpData data = decoder.getBodyHttpData("fromField1"); 
    if (data.getHttpDataType() == HttpDataType.Attribute) { 
    Attribute attribute = (Attribute) data; 
    String value = attribute.getValue() 
    System.out.println("fromField1 :" + value); 
    } 
} 
+0

¿Estás seguro? Busqué en Google esa clase, y encontré solo una biblioteca de terceros llamada "Netty Extension" que la tiene. Es de eso de lo que estás hablando? – ccleve

+0

Lo siento, me estaba refiriendo a Netty 4.0.X que aún no está disponible. Como ya dijiste, HttpPostRequestDecoder de la biblioteca Netty Extension, que ahora se fusionó con Netty 4.0.X. Puede descargarlo desde aquí http://sourceforge.net/projects/goldengate/files/NettyExtension/1.1.9/ –

+0

¿Cómo podemos decodificar la solicitud http pst con el tipo de contenido json? –

2

¿Qué versión de netty estás usando? Netty's HttpRequest admite el método POST. No se tiene conocimiento de ninguna biblioteca que pueda analizar bytes en el mapa de params. Esto es generalmente lo que hace un contenedor de servlet. Tome un método http://svn.apache.org/repos/asf/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/Parameters.java

+0

Esto es útil. Parece que marchan a través de los bytes y se dividen en '=' y '&'. Puede que tenga que hacer algo similar. – ccleve

6

Puede utilizar HttpPostRequestDecoder en Netty 4.x. Es compatible con todo tipo de cuerpo POST. Netty 4.x está marcado como alfa en este momento, pero muy estable. Ver BodyParser en Xitrum.

Si solo necesita analizar un cuerpo simple, igual puede usar QueryStringDecoder en Netty 3.x tratando el cuerpo POST como la parte después de "?" en URL, como este:

QueryStringDecoder decoder = new QueryStringDecoder("?" + 
    request.getContent.toString(org.jboss.netty.util.CharsetUtil.UTF_8)); 
+0

¿Cómo podemos decodificar la solicitud http pst con el tipo de contenido json? –

+1

Obtenga la cadena JSON del cuerpo de la solicitud, luego use bibliotecas de procesamiento JSON como Jackson (Java) o JSON4S (Scala), etc. para procesarlo: 'String jsonString = request.getContent.toString (org.jboss.netty.util .CharsetUtil.UTF_8); ' –