Netty取Http Post body
最近在搭网关,各种问题各种百度谷歌,
解决问题需要耐心,有时看源码,看不下去同事问问,想换换脑子。
遇到有责任心的人还好,总有一批人说空话。。。
以下代码主要是解析http请求的参数,含get,标黄的是重点
package com.my.gateway; import com.my.util.JsonUtils; import com.my.util.HttpUtil; import io.netty.handler.codec.http.*; 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 io.netty.util.CharsetUtil; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; public class ParamParser { private FullHttpRequest request; private String umCode; /** * 构造一个Http请求参数解析器 * @param request */ public ParamParser(FullHttpRequest request, String umCode) { this.request = request; this.umCode=umCode; } /** * 解析请求参数 * @return 包含所有请求参数的键值对, 如果没有参数, 则返回空Map * * @throws IOException */ public Map<String, Object> parse() throws Exception { HttpMethod method = request.getMethod(); Map<String, Object> parmMap = new HashMap<String, Object>(); parmMap.put("umCode", this.umCode); if (HttpUtil.isGetMethod(request)) { // 是GET请求 QueryStringDecoder decoder = new QueryStringDecoder(request.getUri()); decoder.parameters().entrySet().forEach( entry -> { // entry.getValue()是一个List, 只取第一个元素 parmMap.put(entry.getKey(), entry.getValue().get(0)); }); } else if (HttpUtil.isPostMethod(request)) { // 是POST请求 //HttpContent content = new DefaultHttpContent(Unpooled.wrappedBuffer(request.content())); HttpPostRequestDecoder decoder = new HttpPostRequestDecoder(request); if(request.content().isReadable()){ String json=request.content().toString(CharsetUtil.UTF_8); parmMap.putAll(JsonUtils.getMapFromJSON(json)); } decoder.offer(request);//form List<InterfaceHttpData> parmList = decoder.getBodyHttpDatas(); for (InterfaceHttpData parm : parmList) { Attribute data = (Attribute) parm; parmMap.put(data.getName(), data.getValue()); } } else { // 不支持其它方法 throw new Exception("除[GET|POST]外,不支持其它方法!!!"); } return parmMap; } }