参考: Netty4 HTTP请求参数解析(GET, POST)
我们在使用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();
System.out.println(parmMap);
}
对于请求
curl -d "names=whf&abc=123" http:
输出结果为:
{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) {
QueryStringDecoder decoder = new QueryStringDecoder(fullReq.uri());
decoder.parameters().entrySet().forEach( entry -> {
parmMap.put(entry.getKey(), entry.getValue().get(0));
});
} else if (HttpMethod.POST == method) {
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;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69