$.ajax()post方式请求参数无法传递,request.getParameter()无法获取
在前台页面中
$.ajax({
url : "${ctx}/rediscluster/delete.do",
data : {"rname":rname},
type : "post",
dataType:"text",
content-type: "application/json",
success : function(data) {
alert("data");
},
error:function(XMLHttpRequest, textStatus, errorThrown){
alert(errorThrown);
}
});
在后台中,用java+spring mvc
@ResponseBody
@RequestMapping(value="/delete.do",produces = {"application/json;charset=utf-8"})
public String deletenode(@RequestParam("rname")String rname) throws GeneralException{
SqlSession sqlsession = sqlsessionfactory.openSession();
try {
RedisClusterDao dao = sqlsession.getMapper(RedisClusterDao.class);
dao.deletenode(rname);
} catch (Exception e) {
log.error(e.getMessage(), e);
} finally {
sqlsession.close();
}
log.info("delete 集群:{}", rname);
return"OK";
}
特别注意,这里我用的是@RequestParam接收。
运行后,提示String parameter ' rname ' is not present。即:后台接收不到前台传递的rname参数。考虑到可能是spring mvc在接受参数时出现问题,所以,将deletenode(@RequestParam("rname")String rname)方法修改成deletenode(HttpServletRequest request),然后在后台中又用request.getParameter("rname")的方式取数,结果一直显示null.
将ajax的type参数改成get,别的不变,结果,两中方式都可以正常的接收。
用chrome浏览器,可以看到get方式的请求
这里正常的显示参数。
post方式contenttype设置成applicatio/json时:
浏览器提示400,Required String parameter 'rname' is not present.
Post方式contenttype不设置成application/json的request header如下:
当我们的content-type是application/x-www-form-urlencoded的时候,前台传递的参数是可以传到后台的@RequestParam和request.getParameter都可以,事实上,这两种都是一样的,但是当我再前台设置的content-type是application/json的时候,后台就无法接收到参数,两种都不行。
如果是二进制数据传输,像文件上传等,需要设置content-Type multipart/form-data.
特别注意:
ajax传JSON时设置的contenttype 如果是application/json或者text/json时,JAVA中request.getParameter("")怎么也接收不到数据。这是因为,Tomcat的HttpServletRequest类的实现类为org.apache.catalina.connector.Request(实际上是org.apache.coyote.Request)
post请求不是application/x-www-form-urlencoded的,全部直接返回,不作处理,即不会解析表单数据来放到request parameter map中。所以通过request.getParameter(name)是获取不到的。只能使用最原始的方式,读取输入流来获取。
无论是在spring mvc中,还是再struts中,都是一样的。contentType : "application/json"的时候,用post方式提交数据,后台request.getParameter方法接收到的始终是null.
那么,ajax post方式contenttype设置成applicatio/json时,在后台到底有没有办法接收传递的参数呢?肯定是有的,可以看看我的另一篇文章:ajax post方式contenttype设置成applicatio/json时 spring mvc接收参数