Netty将POST、GET参数封装成类使之
2016-09-25 16:04
260 查看
下面是该类的全部代码: 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; } }
Netty4 HTTP请求参数解析(GET, POST)
我们在使用Netty编写HTTP服务器时,一个非常痛苦的地方就是解析POST请求的代码真是太丑陋了,远没有servlet中request.getParameter()优雅。我猜测这是因为Netty是一个网络通讯框架,所以设计者希望尽可能的把底层数据暴露给开发者以提供更好的灵活性。我们可以自己将HTTP请求参数封装成类似于servlet的调用方式。
下面是一个RequestParser类,使用时只需:
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}
这样请求参数的获取就优雅多了。
相关文章推荐
- AFN的初步封装(post、GET、有无参数)
- Retrofit网络请求封装公共参数GET和POST请求
- restful接口实现跨域访问,以及get请求对象参数对象封装,post请求
- HttpURLConnection 对 get和post请求的封装(包括带参数和不带参数)
- OKHttp使用拦截器(Interceptor)POST与GET方法,统一封装传公共参数
- Retrofit简单封装使用--Post请求封装请求体、Get请求通过参数、map方式构建url
- okhttp自定义拦截器,封装公共参数,get或post请求不同的拦截器
- get post 封装公共参数工具类
- JSP中截获POST或GET请求提交的所有参数
- JSP中截获POST或GET请求提交的所有参数
- xmlhttp:open方法中的POST、GET参数的区别
- HTTP协议中POST、GET、HEAD等参数详解
- 参数传递中的编码问题(get和post方式)
- Get和Post的参数传值
- Jsp页面中文参数传递get和post方法分析
- Ajax参数的传递(POST及GET提交)
- xmlhttp:open方法中的POST、GET参数的区别
- Jsp页面中文参数传递get和post方法分析
- XMLHttpRequest.open();第一个参数post,get有什么不同,什么时候选什么,还有其他的,都有什么区别?
- xmlhttp:open方法中的POST、GET参数的区别