Post 请求的 Content-Type 设置
Post 请求的 Content-Type 设置
前几天在测试 HttpServletRequest 获取参数的时候使用 Postman 这个工具发送请求的时候遇到了问题,Post 请求不管怎么发送,始终拿不到数据,Get 请求一点问题都没有。查了好几次终于明白是因为 Content-type 的问题。
一般情况下,我们使用 Post 方式发送 http 请求,默认的 Content-Type 是 application/x-www-form-urlencoded,同样在使用 JQuery 的 ajax 方法的时候使用的也是这个 Content-Type。
但是了,如果用原生的 JS 发送请求,则是使用的 multipart/form-data 这个 Content-type。 Postman 这个工具里也有提供这两个发送 Post 请求的方式。现在我们就来看看这两种请求的区别。
Tomcat 的 HhttpServletRequest 类的实现类为org.apache.catalina.connector.Request 它对于这两种 type 的处理是这样的。如果是 multipart/form-data 当作上传文件的处理请求,如果是 application/x-www-form-urlencoded 的 Post 请求,则解析请求体,将参数放入 requestparameter map 中。其他的都不会解析请求体,这也是用 multipart/form-data 方式发送的 Post 请求无法获取参数的原因。
如果是用 multipart/form-data 的方式传输的数据,可以用下面的方式手动解析数据:
privateString getRequestPayload(HttpServletRequest req) {
StringBuildersb = new StringBuilder();
try(BufferedReaderreader = req.getReader();) {
char[]buff = new char[1024];
int len;
while((len = reader.read(buff)) != -1) {
sb.append(buff,0, len);
}
}catch (IOException e) {
e.printStackTrace();
}
returnsb.toString();
}
之所以要这么区分的原因是普通 Post 请求的数据是键值对,可以很好的解析,但是对于有文件上传的 Post 请求,需要对解析文件作特殊的处理,所以这里做这样一个区分。
参考
AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式