0
点赞
收藏
分享

微信扫一扫

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()。


举报

相关推荐

0 条评论