HttpServletRequest 中的方法
- 获取请求方式 request.getMethod();
- 获取请求类型 request.getContentType();
- 获取所有参数key request.getParameterNames();
- 获取参数值value request.getParameter("keyName");
- 获取取参数请求集合 request.getParameterMap();
- 获取文本流 request.getInputStream();
- 获取URL request.getRequestURL()
- 返回请求URL中的参数: request.getQueryString()
request.getParameter()、 request.getInputStream()、request.getReader()这三种方法是有冲突的,因为流只能被读一次。
GET 请求
由于GET 请求 参数是拼接在URL中的 因此可以通过 getQueryString 方法 获取到请求参数
StringqueryString=request.getQueryString();
POST 请求
由于POST的请求类型不同 可以通过 getContentType方法 获取请求类型
application/x-www-form-urlencoded
可以通过queryDataForParameterMap 方式 也可以通过 queryDataForParameter 方式获取请求参数
Map<String, String[]>paraMap=request.getParameterMap(); Enumeration<String>parameterNames=request.getParameterNames();
application/json
需要通过 request.getInputStream() 流获取请求参数
StringqueryString=IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8);
multipart/form-data
需要通过 request.getInputStream() 流获取请求参数
但是multipart/form-data类型获取的流中会夹杂一些其他信息 因此需要将流进行处理才能得到请求参数
/*** 状态码,表示没有特殊操作*/privatestaticfinalintNONE=0; /*** 表示下一行要读到报头信息*/privatestaticfinalintDATA_HEADER=1; /*** 表示下面要读到表单域的文本值*/privatestaticfinalintFIELD_DATA=2; /*** 请求类型*/publicstaticfinalStringMULTIPART_FORM_DATA="multipart/form-data"; publicstaticfinalStringAPPLICATION_JSON="application/json"; /*** 请求方式*/publicstaticfinalStringGET="GET"; /*** 解析 multipart/form-data* @param request request * @param contentType multipart/form-data * @return 解析multipart/form-data格式提交过来的的流,转成json,这里忽略了报文中的“文件”部分,只解析“文本”字段 */privatestaticStringprocessorRequestOfFormData(HttpServletRequestrequest, StringcontentType) { BufferedReaderrequestBufferedReader=null; JSONObjectjsonObject=newJSONObject(); try { Stringres=IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8); // 表单域的名称StringfieldName=""; // 表单域的值StringfieldValue=""; // 分界符字符串Stringboundary=""; // 结束分界符字符串StringlastBoundary=""; intpos=contentType.indexOf("boundary="); if (pos!=-1) { pos+="boundary=".length(); // 解析出分界符boundary="--"+contentType.substring(pos); // 得到结束分界符lastBoundary=boundary+"--"; } // 起始状态为NONEintstate=NONE; // 从字符串中得到输出缓冲流requestBufferedReader=newBufferedReader(newStringReader(res)); while (true) { //读一行Strings=requestBufferedReader.readLine(); //如果读到结束标志if (s==null||s.equals(lastBoundary)) { break; } switch (state) { caseNONE: if ((s.startsWith(boundary))) { // 如果读到分界符,则表示下一行一个头信息state=DATA_HEADER; } break; caseDATA_HEADER: pos=s.indexOf("name="); if (pos!=-1) { // 1表示后面的"的占位(引号的占位)pos+="name=".length() +1; s=s.substring(pos, s.length() -1); // 表单域的名称放入fieldNamefieldName=s; // 设置状态码,准备读取表单域的值state=FIELD_DATA; } break; caseFIELD_DATA: // 读取表单域的值,再次读取,因为中间有空行s=requestBufferedReader.readLine(); // 存入fieldValuefieldValue=s; jsonObject.put(fieldName, fieldValue); state=NONE; break; default: break; } } } catch (Exceptione) { log.error("processorRequestOfFormData error ", e); } finally { try { assertrequestBufferedReader!=null; requestBufferedReader.close(); } catch (Exceptione) { log.error("processorRequestOfFormData close reader error ", e); } } returnjsonObject.toJSONString(); }