Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Netty-如何检测/提取帖子内容?_Java_Json_Http_Netty - Fatal编程技术网

Java Netty-如何检测/提取帖子内容?

Java Netty-如何检测/提取帖子内容?,java,json,http,netty,Java,Json,Http,Netty,我使用的是Netty 5.0,对它的http功能还是比较陌生的。 我需要通过json字符串在Netty服务器和JavaScript应用程序之间进行通信 服务器处理程序非常简单,如下代码所示: public class HttpServerHandler extends SimpleChannelInboundHandler<Object> { @Override protected void messageReceived(ChannelHandlerContext

我使用的是Netty 5.0,对它的http功能还是比较陌生的。 我需要通过json字符串在Netty服务器和JavaScript应用程序之间进行通信

服务器处理程序非常简单,如下代码所示:

public class HttpServerHandler extends SimpleChannelInboundHandler<Object> {
    @Override
    protected void messageReceived(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println(msg);
    }
}

我只需要最后一行,json字符串。但是,服务器接收到的输入是多个字符串,我无法将它们转换为高层结构(例如
HttpRequest
)来获取该内容。我可以解析/检查所有字符串来检测json字符串,但看起来这是最糟糕的方法。我曾尝试改进代码(例如使用
SimpleChannelInboundHandler
,删除
DelimiterBasedFrameDecoder
),但到目前为止运气不佳。

要制作Web服务器,您应该结合可选的

您的
通道初始值设定项应如下所示:

公共类NettyHttpServerInitializer扩展了ChannelInitializer{
@凌驾
public void initChannel(SocketChannel ch)引发异常{
ChannelPipeline=通道管道();
addLast(“http”,新的HttpServerCodec());
//可选,使生活更轻松
pipeline.addLast(“dechunker”,新的HttpObjectAggregator(65536));
addLast(“handler”,新的HttpServerHandler());
}
}
如果存在
HttpObjectAggregator
,或者存在不同类型的
HttpRequest
消息,则处理程序将处理
FullHttpRequest
(这更难,请参见示例)

我的回答主要集中在我们收到的信息上

当收到
FullHttpRequest
时,我们可以做以下几件事:

  • 使用
    request.getUri()
  • 获取
    request.getMethod()
  • 使用
    request.headers()
  • 使用
    request.content()
要回答您的问题,您应该首先调用
request.getMethod()
检查该方法是POST还是PUT,然后调用
request.content()
获取内容

例如:

公共类HttpServerHandler扩展了SimpleChannelInboundHandler{
@凌驾
受保护的void messageReceived(ChannelHandlerContext ctx,FullHttpRequest msg)引发异常{
if(msg.getMethod().equals(HttpMethod.POST)| | msg.getMethod().equals(HttpMethod.PUT)){
System.out.println(msg.content().toString(Charset.forName(“UTF-8”));
}
}
}

非常感谢您的快速回答和代码。它就像一个魅力!!!(对于有需要的人来说,这只是一个小小的改变(最初的一个可能在其他系统上运行良好,但在我的系统上有点问题):将if(msg.getMethod().equals(“POST”)| | msg.getMethod().equals(“GET”)行更改为if(msg.getMethod().toString().equals(“POST”)| msg.getMethod().toString().equals(“GET”))@Tony我已经更新了代码,使其与进行比较,而不是将其与字符串进行比较,这确实是一个bug。
public class NettyHttpServerInitializer extends ChannelInitializer<SocketChannel> {
    @Override
    public void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();

        pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
        pipeline.addLast("decoder", new StringDecoder(Charset.forName("UTF-8")));
        pipeline.addLast("encoder", new StringEncoder(Charset.forName("UTF-8")));
        pipeline.addLast("handler", new HttpServerHandler());
   }
}
POST / HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 51
Origin: http://127.0.0.1:8888
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: */ *
Referer: http://127.0.0.1:8888/MyWebApp02.html
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8

{"cmd":"he", "ver":1, "dvt":3}