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 parse() throws Exception {
        HttpMethod method = request.getMethod();

        Map parmMap = new HashMap();
        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 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;
    }
}
Netty取Http Post body_第1张图片



你可能感兴趣的:(Netty取Http Post body)