2011-12-28 13 views
6

Sto utilizzando Netty e devo accettare e analizzare le richieste HTTP POST. Per quanto posso dire, Netty non ha il supporto integrato per i POST, solo GET. (Si tratta di una libreria piuttosto basso livello che si occupa di operazioni di rete primitive. Utilizzando un servlet container, che fa tutta questa roba fuori dalla scatola, non è un'opzione.)Come decodificare i dati POST http in Java?

Se ho il contenuto di una richiesta POST come una serie di byte, qual è il modo più rapido e privo di errori per analizzarlo in una mappa di parametri?

Potrei scriverlo da solo, ma ci deve essere essere alcuni metodi incorporati nel JDK che rendono questo più facile. E scommetto che ci sono alcuni trucchi e casi d'angolo da affrontare.

+0

puoi dare il codice di esempio di ciò che si sta cercando di fare? – mossplix

risposta

13

Netty ha un avanzato richiesta POST decoder (HttpPostRequestDecoder) in grado di decodificare Http Attributi, FileUpload Contento di codifica Chunked.

Ecco un semplice form decodifica esempio

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

Sei sicuro? Ho cercato su Google quella classe e ho trovato solo una libreria di terze parti chiamata "Netty Extension". E 'questo quello di cui stai parlando? – ccleve

+0

Mi dispiace che mi riferissi a Netty 4.0.X che non è ancora disponibile. Come hai detto, HttpPostRequestDecoder dalla libreria Netty Extension, che ora è unita a Netty 4.0.X. Puoi scaricarlo da qui http://sourceforge.net/projects/goldengate/files/NettyExtension/1.1.9/ –

+0

Come possiamo decodificare la richiesta HTTP con json content-type? –

2

Quale versione di netty stai usando? HttpRequest di Netty supporta il metodo POST. Non è a conoscenza di alcuna libreria che potrebbe analizzare i byte sulla mappa dei parametri. Questo è solitamente ciò che fa un contenitore servlet. Date un'occhiata alla fonte del gatto sul modo in cui hanno implementato processParameters() metodo http://svn.apache.org/repos/asf/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/Parameters.java

+0

Questo è utile. Sembra che sfuggano i byte e si dividano in "=" e "&". Potrei dover fare qualcosa di simile. – ccleve

6

È possibile utilizzare HttpPostRequestDecoder in Netty 4.x. Supporta tutti i tipi di corpo POST. Netty 4.x è contrassegnato come alfa al momento, ma molto stabile. Vedi BodyParser in Xitrum.

Se è necessario analizzare solo il corpo semplice, è comunque possibile utilizzare QueryStringDecoder in Netty 3.x trattando il corpo POST come la parte dopo "?" in URL, in questo modo:

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

Come possiamo decodificare la richiesta HTTP prima con json content-type? –

+1

Ottieni la stringa JSON dal corpo della richiesta, quindi utilizza le librerie di elaborazione JSON come Jackson (Java) o JSON4S (Scala) ecc. Per elaborarla: 'String jsonString = request.getContent.toString (org.jboss.netty.util .CharsetUtil.UTF_8); ' –