Netty学习笔记之一(Netty解析简单的Http Post Json 请求)

简介:

一,HTTP解码器可能会将一个HTTP请求解析成多个消息对象。

 ch.pipeline().addLast(new HttpServerCodec());
 ch.pipeline().addLast(new ParseRequestHandler());

经过HttpServerCodec解码之后,一个HTTP请求会导致:ParseRequestHandler的 channelRead()方法调用多次(测试时 "received message"输出了两次)

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg)
            throws Exception {  
        System.out.println("received message");

可以用HttpObjectAggregator 将多个消息转换为单一的一个FullHttpRequest,如下:

 ch.pipeline().addLast(new HttpServerCodec());
 ch.pipeline().addLast(new HttpObjectAggregator(65536));
 ch.pipeline().addLast(new ParseRequestHandler());

此时,一个HTTP消息(Object msg)是下面这样的。

复制代码
HttpObjectAggregator$AggregatedFullHttpRequest(decodeResult: success, version: HTTP/1.1, content: CompositeByteBuf(ridx: 0, widx: 17, cap: 17, components=1))
POST / HTTP/1.1
Host: 127.0.0.1:8888
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: null
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 17
Cookie: _ga=GA1.1.457486782.1446782739
Connection: keep-alive
复制代码

从上面可以看出,实体首部字段Content-Length是17,表明实体主体有17个字节。

而我发送的消息是这样的:

HTTP POST 请求,请求体是JSON格式的数据。这里使用的是json-lib解析的 Json字符串。代码如下:

复制代码
    //parse job type 0,1
    private String getJobType(FullHttpRequest request) throws IOException{
        ByteBuf jsonBuf = request.content();
        String jsonStr = jsonBuf.toString(CharsetUtil.UTF_8);
        JSONObject jsonObj = JSONObject.fromObject(jsonStr);
        String jobType = jsonObj.getString("jobType");
        return jobType;
    }
复制代码

需要注意是:使用json-lib解析Json字符串时,需要其他的依赖包如下:

解析完成之后,需要把处理后的结果发送到下一个ChannelHandler,进行下一步的处理。

复制代码
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg)
    throws Exception {
        //do some process
 .....
        ctx.fireChannelRead(job);
}
复制代码

注意,使用的是fireChannelRead()方法,而不是 ctx.writeAndFlush(...)。因为,writeAndFlush/write 是Outbound,它是把消息发送到上一个Handler,进而发送到remote peer,而这里是InBound。具体参考:

 这里,通过 ctx.fireChannelRead(job); 将处理后的结果发送到下一个Channel处理。

 ch.pipeline().addLast(new HttpServerCodec());
 ch.pipeline().addLast(new HttpObjectAggregator(2048));
 ch.pipeline().addLast(new ParseRequestHandler());
 ch.pipeline().addLast(new OozieRequestHandler());

下一个Handler是OozieRequestHandler,它负责向Oozie Server提交作业,之后返回jobId给客户端(HttpServerCodec  Handler 负责底层传输细节)。

Netty构造一个http 响应的方法如下:

复制代码
String jobId = doPost(jobConfig);
FullHttpResponse response = new DefaultFullHttpResponse(
                    HttpVersion.HTTP_1_1, HttpResponseStatus.OK,
                    Unpooled.wrappedBuffer(jobId.getBytes()));

response.headers().set(CONTENT_TYPE, "application/xml");
            
response.headers().setInt(CONTENT_LENGTH,
                    response.content().readableBytes());
            ctx.write(response).addListener(ChannelFutureListener.CLOSE);
复制代码

 

整个完整代码可参考:https://github.com/hapjin/netty_schedule


本文转自hapjin博客园博客,原文链接:http://www.cnblogs.com/hapjin/p/5610253.html,如需转载请自行联系原作者

相关文章
|
5月前
|
JSON 缓存 自然语言处理
多语言实时数据微店商品详情API:技术实现与JSON数据解析指南
通过以上技术实现与解析指南,开发者可高效构建支持多语言的实时商品详情系统,满足全球化电商场景需求。
|
7月前
|
存储 JSON 关系型数据库
【干货满满】解密 API 数据解析:从 JSON 到数据库存储的完整流程
本文详解电商API开发中JSON数据解析与数据库存储的全流程,涵盖数据提取、清洗、转换及优化策略,结合Python实战代码与主流数据库方案,助开发者构建高效、可靠的数据处理管道。
|
6月前
|
JSON 算法 API
淘宝商品评论API接口核心解析,json数据返回
淘宝商品评论API是淘宝开放平台提供的数据服务接口,允许开发者通过编程方式获取指定商品的用户评价数据,包括文字、图片、视频评论及评分等。其核心价值在于:
|
4月前
|
JSON Java Go
【GoGin】(2)数据解析和绑定:结构体分析,包括JSON解析、form解析、URL解析,区分绑定的Bind方法
bind或bindXXX函数(后文中我们统一都叫bind函数)的作用就是将,以方便后续业务逻辑的处理。
331 3
|
4月前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
347 0
|
8月前
|
JSON 定位技术 PHP
PHP技巧:解析JSON及提取数据
这就是在PHP世界里探索JSON数据的艺术。这场狩猎不仅仅是为了获得数据,而是一种透彻理解数据结构的行动,让数据在你的编码海洋中畅游。通过这次冒险,你已经掌握了打开数据宝箱的钥匙。紧握它,让你在编程世界中随心所欲地航行。
260 67
|
6月前
HTTP协议中请求方式GET 与 POST 什么区别 ?
GET和POST的主要区别在于参数传递方式、安全性和应用场景。GET通过URL传递参数,长度受限且安全性较低,适合获取数据;而POST通过请求体传递参数,安全性更高,适合提交数据。
634 2
|
5月前
|
JSON 自然语言处理 API
多语言实时数据淘宝商品评论API:技术实现与JSON数据解析指南
淘宝商品评论多语言实时采集需结合官方API与后处理技术实现。建议优先通过地域站点适配获取本地化评论,辅以机器翻译完成多语言转换。在合规前提下,企业可构建多语言评论数据库,支撑全球化市场分析与产品优化。
|
9月前
|
JavaScript 前端开发 开发者
Node学习笔记:HTTP模块
总的来说,Node.js的HTTP模块是一个强大的工具,可以帮助你处理HTTP协议的各种需求。无论你是想开设自己的餐厅(创建服务器),还是想去别的餐厅点菜(发出请求),HTTP模块都能满足你的需求。
299 18
|
9月前
|
安全 网络协议 算法
HTTP/HTTPS与SOCKS5协议在隧道代理中的兼容性设计解析
本文系统探讨了构建企业级双协议隧道代理系统的挑战与实现。首先对比HTTP/HTTPS和SOCKS5协议特性,分析其在工作模型、连接管理和加密方式上的差异。接着提出兼容性架构设计,包括双协议接入层与统一隧道内核,通过协议识别模块和分层设计实现高效转换。关键技术部分深入解析协议转换引擎、连接管理策略及加密传输方案,并从性能优化、安全增强到典型应用场景全面展开。最后指出未来发展趋势将更高效、安全与智能。
375 1

热门文章

最新文章