Post 请求的 Content-Type 设置

前几天在测试 HttpServletRequest 获取参数的时候使用 Postman 这个工具发送请求的时候遇到了问题,Post 请求不管怎么发送,始终拿不到数据,Get 请求一点问题都没有。查了好几次终于明白是因为 Content-type 的问题。

一般情况下,我们使用 Post 方式发送 http 请求,默认的 Content-Typeapplication/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 请求,需要对解析文件作特殊的处理,所以这里做这样一个区分。

参考:http://blog.csdn.net/mhmyqn/article/details/25561535