2016-04-07 12 views
0

Ich benutze netty 4.1 eingebettet in Java und versuchen, Daten von einer Client-POST-Anfrage in der Pipeline abrufen. Ich habe mehrere Optionen ausprobiert, die ich online gefunden habe, aber nichts funktioniert ...Java Netty erhalten POST Anfrage Inhalt

Vielleicht hat jemand einen nützlichen Gedanken dazu.

Grüße und vielen Dank für alle, die helfen.

Pipeline:

p.addLast ("codec", new HttpServerCodec()); 
    p.addLast("decoder", new HttpRequestDecoder()); 
    p.addLast("encoder", new HttpRequestEncoder()); 
    p.addLast("handler",new InboundHandlerA()); 

Handler:

private static class InboundHandlerA extends ChannelInboundHandlerAdapter{ 
    @Override 
    public void channelActive(ChannelHandlerContext ctx) { 
     System.out.println("Connected!"); 
     ctx.fireChannelActive(); 
    } 

public void channelRead (ChannelHandlerContext channelHandlerCtxt, Object msg) throws Exception { 

     System.out.println(msg); 
    } 
    } 
+0

Was haben Sie im Moment? Wie sieht Ihr aktueller Handler und Ihre Pipeline aus? – Ferrybig

+0

@Ferrybig Ich bearbeitet den Post :) Ich möchte einen Switch-Fall in ChannelRead für POST oder GET – ekul

+0

@Ferrybig Ich kann meine Frage angeben: Welche Methode muss ich überschreiben (und wie) in welcher Handler POST Content – ekul

Antwort

5

Recieving HTTP-Anfragen mit netty einfach ist, können Sie dies mit der folgenden Pipeline:

// Provides support for http objects: 
p.addLast("codec", new HttpServerCodec()); 
// Deals with fragmentation in http traffic: 
p.addLast("aggregator", new HttpObjectAggregator(Short.MAX_VALUE)); 
// Deals with optional compression of responses: 
// p.addLast("aggregator", new HttpContentCompressor()); 
p.addLast("handler",new InboundHandlerA()); 

Dieses verwendet werden kann mit einem benutzerdefinierten SimpleChannelInboundHandler<FullHttpRequest>:

public class InboundHandlerA extends SimpleChannelInboundHandler<FullHttpRequest> { 

    @Override 
    public void channelActive(ChannelHandlerContext ctx) { 
     super.channelActive(ctx); 
     System.out.println("Connected!"); 
    } 

    // Please keep in mind that this method 
     will be renamed to messageReceived(ChannelHandlerContext, I) in 5.0. 
    @Override 
    public void channelRead0 (ChannelHandlerContext ctx, 
           FullHttpRequest msg) throws Exception { 
     // Check for invalid http data: 
     if(msg.getDecoderResult() != DecoderResult.SUCCESS) { 
      ctx.close(); 
      return; 
     } 

     System.out.println("Recieved request!"); 
     System.out.println("HTTP Method: " + msg.getMethod()); 
     System.out.println("HTTP Version: " + msg.getProtocolVersion()); 
     System.out.println("URI: " + msg.getUri()); 
     System.out.println("Headers: " + msg.headers()); 
     System.out.println("Trailing headers: " + msg.trailingHeaders()); 

     ByteBuf data = msg.content(); 
     System.out.println("POST/PUT length: " + data.readableBytes()); 
     System.out.println("POST/PUT as string: "); 
     System.out.println("-- DATA --"); 
     System.out.println(data.toString(StandardCharsets.UTF_8)); 
     System.out.println("-- DATA END --"); 

     // Send response back so the browser won't timeout 
     ByteBuf responseBytes = ctx.alloc().buffer(); 
     responseBytes.writeBytes("Hello World".getBytes()); 

     FullHttpResponse response = new DefaultFullHttpResponse(
      HttpVersion.HTTP_1_1, HttpResponseStatus.OK, responseBytes); 
     response.headers().set(HttpHeaders.Names.CONTENT_TYPE, 
           "text/plain"); 
     response.headers().set(HttpHeaders.Names.CONTENT_LENGTH, 
           response.content().readableBytes()); 

     response.headers().set(HttpHeaders.Names.CONNECTION, 
           HttpHeaders.Values.KEEP_ALIVE); 
     ctx.write(response); 
    } 
} 

Der obige Code gibt alle Details einer eingehenden Nachricht einschließlich der Postdaten aus. Wenn Sie nur die Postdaten benötigen, können Sie eine einfache if-Anweisung hinzufügen, um nach einem POST-Antworttyp zu filtern.

+0

zu bekommen Danke für die Erklärung. Ich werde herausfinden, ob es mir jetzt hilft und eine Antwort danach schreiben :) – ekul

+0

Viele der Methoden, die Sie verwenden, werden als veraltet markiert. Ich bekomme das "Verbunden!" Nachricht aber nicht mehr. Vielleicht ist es wichtig für Sie zu wissen, dass die Pipeline von einem SocketChannel ch und dem letzten ChannelPipeline p = ch.pipeline() erstellt wird; – ekul

+0

ich konnte jetzt msg.getMethod() verwenden. Das Problem scheint diese if-Anweisung if (! Msg.getDecoderResult()) zu sein. Ich kann es nicht so funktionieren lassen. es heißt: "Der Operator! ist für die Argumentart (en) DecoderResult nicht definiert." i triet if (msg.getDecoderResult()! = null) ohne resonable result ... – ekul