HTTP请求解析
HTTP请求一般分为五个部分:①请求方法②请求地址③是协议及版本号④报文头⑤报文体
重点讲报文头,因为获取请求参数的方法都是根据报文头类型不同,获取的方法不一样,常
见的头请求类型主要有这2种:1、application/x-www-form-urlencoded,2、application/json
第一种就是表单请求。第二种是JSON请求。因为流只能读取一次,所以怎么同时来兼容这两
种请求方法呢?
public static String getParamRequestStr(HttpServletRequest request){
try {
//获取application/x-www-form-urlencoded类型的头请求内容的参数
InputStream inStream = request.getInputStream();
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
}
outSteam.close();
inStream.close();
String result = new String(outSteam.toByteArray(), "utf-8");
//获取application/json类型的头请求内容的参数
if(org.apache.commons.lang.StringUtils.isBlank(result)){
Map<String,String> parmMap=new HashMap<String,String>();
// //方式一:getParameterMap(),获得请求参数map
// Map<String,String[]> map= request.getParameterMap();
// //参数名称
// Set<String> key=map.keySet();
// //参数迭代器
// Iterator<String> iterator = key.iterator();
// while(iterator.hasNext()){
// String k=iterator.next();
// parmMap.put(k, map.get(k)[0]);
// }
//方式二:
Enumeration<String> a = request.getParameterNames();
String parm=null;
String val="";
while(a.hasMoreElements()){
//参数名
parm=a.nextElement();
//值
val=request.getParameter(parm);
parmMap.put(parm, val);
}
return JSON.toJSONString(parmMap);
}
return result;
}catch (Exception e){
logger.error("获取request参数错误",e);
}
return null;
}
所以先用来流来读取,如果读取不到,再用获取请求参数名,以上的方法可以同时接收到表单请求跟JSON请求的参数