HTTP - Get / Post 请求中,URL & FORM 参数如何分别获取?

我们都知道在 HttpServletRequest 中,URL 和 FORM 参数共存时,都会出现在 getParameterMap() 方法中,由于一些业务需要区分这两者,笔者研究了下它的类,其实也可以找到各自的区分的办法,如下。

package com.chinadaas.platform.servicecenter.mycommon.handler;
 
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Maps;
import lombok.Getter;
import lombok.Setter;
import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.Part;
import java.io.*;
import java.nio.charset.Charset;
import java.util.Collection;
import java.util.Map;
import java.util.Objects;
 
@Getter
@Setter
public class RequestHandler extends HttpServletRequestWrapper {
 
    private String rawJson;
 
    private String form;
 
    private String query;
 
    public static RequestHandler getInstance(HttpServletRequest request) {
        if (request instanceof StandardMultipartHttpServletRequest) {
            request = ((StandardMultipartHttpServletRequest) request).getRequest();
        }
        return (RequestHandler)request;
    }
 
    public RequestHandler(HttpServletRequest request) throws IOException {
        super(request);
        StringBuilder sb = new StringBuilder();
        InputStream ins = request.getInputStream();
        BufferedReader isr = null;
        try{
            // rawJson case
            if(ins != null){
                isr = new BufferedReader(new InputStreamReader(ins, Charset.defaultCharset()));
                char[] charBuffer = new char[128];
                int readCount;
                while((readCount = isr.read(charBuffer)) != -1){
                    sb.append(charBuffer,0,readCount);
                }
                setRawJson(sb.toString());
            }
 
            // check getParameterMap
            Map<String, String[]> tParamMap = request.getParameterMap();
            if (!(Objects.nonNull(tParamMap) && tParamMap.size() > 0)) {
                return;
            }
            Map<String, String> paramMap = Maps.newHashMap();
            tParamMap.entrySet().forEach(param -> {
                /* Array T String */
                String[] valArr = param.getValue();
                StringBuilder sbVal = new StringBuilder();
                for (String val : valArr) {
                    sbVal.append(val).append(",");
                }
                // clean last ","
                String val = sbVal.substring(0, sbVal.length()-1);
                paramMap.put(param.getKey(), val);
            });
 
            // form case
            // business try catch
            try {
                Collection<Part> parts = request.getParts();
                Map<String, String> form = Maps.newHashMap();
                parts.forEach(part -> {
                    String paramKey = part.getName();
                    String paramVal = paramMap.get(paramKey);
                    paramMap.remove(paramKey);
                    form.put(paramKey, paramVal);
                });
                setForm(JSON.toJSONString(form));
            }
            catch (Exception e) {
                e.printStackTrace();
                // no form-data
            }
 
            // query case
            setQuery(JSON.toJSONString(paramMap));
            System.out.println(1);
        }
        finally {
            if(isr != null) {
                isr.close();
            }
        }
    }
 
    @Override
    public ServletInputStream getInputStream() {
        try {
            final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(rawJson.getBytes(Charset.defaultCharset()));
            return new ServletInputStream() {
                @Override
                public int read() {
                    return byteArrayInputStream.read();
                }
 
                @Override
                public boolean isFinished() {
                    return false;
                }
 
                @Override
                public boolean isReady() {
                    return false;
                }
 
                @Override
                public void setReadListener(ReadListener listener) {
 
                }
            };
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }
 
    @Override
    public BufferedReader getReader() {
        return new BufferedReader(new InputStreamReader(this.getInputStream()));
    }
}
  • 这里就分别获取到 URL、FORM、RAW-JSON 参数。
  • 补充:也有专门获取 URL 参数的方法,request.getQueryString()。

猜你喜欢

转载自blog.csdn.net/Dream_Weave/article/details/107366460
今日推荐