Netty http服务器解码json体

时间:2015-09-22 13:04:06

标签: netty

我的客户端通过post向netty http服务器发送http请求,帖子正文是json的格式。 我的问题是如何在netty http服务器中解码post body? 我找到了一些代码:

HttpPostRequestDecoder decoder = new HttpPostRequestDecoder( new DefaultHttpDataFactory(false), request );
                /*InterfaceHttpData*/String data = decoder.getBodyHttpDatas().toString();

如果客户端以json的格式发送post body,如何将post body提取到json? 我正在使用netty 4

2 个答案:

答案 0 :(得分:1)

在您的http服务器中,您应该拥有从ChannelInboundHandlerAdapter扩展的处理程序。

你有最重要的方法:channelRead,就像这样:

public class MyHttpServerHandler extends ChannelInboundHandlerAdapter{
    private static final ObjectMapper JsonMapper = new ObjectMapper();

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {

        if (msg instanceof HttpRequest) {
            LOG.info("I'm HttpRequest");

            FullHttpRequest req = (FullHttpRequest) msg;

            if (HttpHeaders.is100ContinueExpected(req)) {
                ctx.write(new DefaultFullHttpResponse(HTTP_1_1, CONTINUE));
            }

            // here your json
            ObjectNode  data = parseData(req);

        }
    }

    private ObjectNode parseData(FullHttpRequest req){
        ObjectNode res;
        try {
            res = JsonMapper.readValue(req.content().toString(CharsetUtil.UTF_8), ObjectNode.class);
            return res;
        }
        catch (IOException e) {

        }
        return null;
    }



    @Override
    public void channelRegistered(ChannelHandlerContext ctx) throws Exception {
        super.channelRegistered(ctx);
    }

    @Override
    public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
        super. channelUnregistered(ctx);
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        ctx.close();
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) {
        ctx.flush();
    }
}

答案 1 :(得分:0)

我不建议直接使用Netty构建HttpServer。相反,你应该https://github.com/RestExpress/RestExpress。 RestExpress基本上是Netty的包装器,它用于定义由Netty Http Server支持的API框架。所以这很容易解决你的问题。 解析一个HttpPacket并自己获得JSON可能会很痛苦。这一切都是由RestExpress为您完成的。所以一定要考虑使用它。