我的客户端通过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
答案 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为您完成的。所以一定要考虑使用它。