Netty4 HTTP请求参数解析(GET, POST)
来源:互联网 发布:男人的例假 知乎 编辑:程序博客网 时间:2024/06/05 17:49
我们在使用Netty编写HTTP服务器时,一个非常痛苦的地方就是解析POST请求的代码真是太丑陋了,远没有servlet中request.getParameter()
优雅。我猜测这是因为Netty是一个网络通讯框架,所以设计者希望尽可能的把底层数据暴露给开发者以提供更好的灵活性。我们可以自己将HTTP请求参数封装成类似于servlet的调用方式。
下面是一个RequestParser
类,使用时只需:
@Override protected void messageReceived(ChannelHandlerContext ctx, FullHttpRequest msg) throws Exception { Map<String, String> parmMap = new RequestParser(msg).parse(); // 将GET, POST所有请求参数转换成Map对象 System.out.println(parmMap); }
对于请求
curl -d "names=whf&abc=123" http://127.0.0.1:8080
输出结果为:
{names=whf, abc=123}
这样请求参数的获取就优雅多了。下面是该类的全部代码:
import cn.fh.http.exception.BaseCheckedException;import cn.fh.http.exception.MethodNotSupportedException;import io.netty.handler.codec.http.FullHttpRequest;import io.netty.handler.codec.http.HttpMethod;import io.netty.handler.codec.http.QueryStringDecoder;import io.netty.handler.codec.http.multipart.Attribute;import io.netty.handler.codec.http.multipart.HttpPostRequestDecoder;import io.netty.handler.codec.http.multipart.InterfaceHttpData;import java.io.IOException;import java.util.HashMap;import java.util.List;import java.util.Map;/** * HTTP请求参数解析器, 支持GET, POST * Created by whf on 12/23/15. */public class RequestParser { private FullHttpRequest fullReq; /** * 构造一个解析器 * @param req */ public RequestParser(FullHttpRequest req) { this.fullReq = req; } /** * 解析请求参数 * @return 包含所有请求参数的键值对, 如果没有参数, 则返回空Map * * @throws BaseCheckedException * @throws IOException */ public Map<String, String> parse() throws BaseCheckedException, IOException { HttpMethod method = fullReq.method(); Map<String, String> parmMap = new HashMap<>(); if (HttpMethod.GET == method) { // 是GET请求 QueryStringDecoder decoder = new QueryStringDecoder(fullReq.uri()); decoder.parameters().entrySet().forEach( entry -> { // entry.getValue()是一个List, 只取第一个元素 parmMap.put(entry.getKey(), entry.getValue().get(0)); }); } else if (HttpMethod.POST == method) { // 是POST请求 HttpPostRequestDecoder decoder = new HttpPostRequestDecoder(fullReq); decoder.offer(fullReq); List<InterfaceHttpData> parmList = decoder.getBodyHttpDatas(); for (InterfaceHttpData parm : parmList) { Attribute data = (Attribute) parm; parmMap.put(data.getName(), data.getValue()); } } else { // 不支持其它方法 throw new MethodNotSupportedException(""); // 这是个自定义的异常, 可删掉这一行 } return parmMap; }}
0 0
- Netty4 HTTP请求参数解析(GET, POST)
- Netty4 HTTP请求参数解析(GET, POST)
- HTTP GET/POST 请求参数长度
- 【http】get/post 获取请求参数
- http get或者post请求获取参数
- http get/post请求及json解析
- HTTP的post和get请求解析
- python http请求post参数,json解析
- 关于http请求中get\post请求参数的限制
- http post get 请求
- HTTP GET/POST 请求
- http post get请求
- http请求 get post
- http post get请求
- HTTP请求GET,POST
- Http请求 post get
- 关于 HTTP GET/POST 请求参数长度最大值的问题
- Android中的http带参数网络请求,GET和POST
- 中位数求和 BUAA214 大新闻
- cygwin(x64) 下编译 redis
- 如何定义一个带参数的宏
- striving for simplicity:the all convolutional net
- 电脑随机数是如何生成的?
- Netty4 HTTP请求参数解析(GET, POST)
- 解决一些网站文字不能复制的问题?java应用
- POJ 1088 滑雪
- 将Cocos2d-x从iOS平台移植到Android平台需要修改的地方
- Good Bye2015,Hello 2016
- Android动态广播添加权限
- hadoop安装包的目录结构
- 整数拆分 算法。
- 【leetcode题解】【M】【10】318. Maximum Product of Word Lengths