Netty取Http Post body

在搭建网关过程中,通过Netty处理HTTP请求时,本文聚焦于如何获取POST请求的body内容。通过分析源码和交流,解决解析参数的问题,强调了GET请求和POST请求中参数解析的重点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 最近在搭网关,各种问题各种百度谷歌,

解决问题需要耐心,有时看源码,看不下去同事问问,想换换脑子。

遇到有责任心的人还好,总有一批人说空话。。。

以下代码主要是解析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;
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值