之前写了一个post请求如下:
$.ajax({
url:"register",type:"POST",
contentType:"text/json;charset=UTF-8",
data:{"useringId":useringId
},
error : function() {
alert('发生错误,请重试!');
},
success:function(data){
if(data.status==1){
$(_this).parent().html("<span>已转为正式用户</span>");
}
else if(data.status==2){
alert("后台错误!");
}
}
});
请求报400,一看参数,发现useringId这个参数在request payload中。大致如下:
- RequestURL:http://127.0.0.1:8080/test/test.do
- Request Method:POST
- Status Code:200 OK
- Request Headers
- Accept:*/*
- Accept-Encoding:gzip,deflate,sdch
- Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
- AlexaToolbar-ALX_NS_PH:AlexaToolbar/alxg-3.2
- Connection:keep-alive
- Content-Length:28
- Content-Type:text/plain;charset=UTF-8
- Cookie:JSESSIONID=C40C7823648E952E7C6F7D2E687A0A89
- Host:127.0.0.1:8080
- Origin:http://127.0.0.1:8080
- Referer:http://127.0.0.1:8080/test/index.jsp
- User-Agent:Mozilla/5.0 (Windows NT 6.1)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36
- Request Payload
- useringId=9
- Response Headers
- Content-Length:2
- Date:Sun, 11 May 2014 11:49:23 GMT
- Server:Apache-Coyote/1.1
百度后得知,这是由于contentType引起的“误会”。
jquery在执行post请求时,会设置Content-Type为application/x-www-form-urlencoded,所以服务器能够按键值对方式正确解析,而使用原生ajax请求,如果不显示的设置Content-Type,那么默认是text/plain,或设置contentType不是application/x-www-form-urlencoded,这时服务器就不知道怎么解析数据了,所以才只能通过获取原始数据流的方式来进行解析请求数据。
解析方式如下:
- privateString getRequestPayload(HttpServletRequest req) {
- StringBuildersb = new StringBuilder();
- try(BufferedReaderreader = req.getReader();) {
- char[]buff = new char[1024];
- intlen;
- while((len = reader.read(buff)) != -1) {
- sb.append(buff,0, len);
- }
- }catch (IOException e) {
- e.printStackTrace();
- }
- returnsb.toString();
- }