摘要:场景如下前端使用向后台发了一个为的请求,后台接口如下发现接收不到的信息。改为也一样接收不到。表单请求提交时,使用的是,而使用原生的请求如果不指定请求头,默认使用的是。
场景如下:
前端vue使用axios向后台发了一个Content-type为application/json的post请求,
后台springmvc接口如下:
@RequestMapping("xxx") public Result xxx(User user) { Result result = Result.getSuccessResult(); return result; }
发现接收不到user的信息。
改为 request.getParamter 也一样接收不到。
搜索一番,从这篇博客找到了答案
AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
jquery在执行post请求时,会设置Content-Type为application/x-www-form-urlencoded,所以服务器能够正确解析,而使用原生ajax请求时,如果不显示的设置Content-Type,那么默认是text/plain,这时服务器就不知道怎么解析数据了,所以才只能通过获取原始数据流的方式来进行解析请求数据。
HTTP POST表单请求提交时,使用的Content-Type是application/x-www-form-urlencoded,而使用原生AJAX的POST请求如果不指定请求头RequestHeader,默认使用的Content-Type是text/plain;charset=UTF-8。
由于Tomcat对于Content-Type multipart/form-data(文件上传)和application/x-www-form-urlencoded(POST请求)做了“特殊处理”。
服务器为什么会对表单提交和文件上传做特殊处理,是因为表单提交数据是名值对的方式,且Content-Type为application/x-www-form-urlencoded,而文件上传服务器需要特殊处理,普通的post请求(Content-Type不是application/x-www-form-urlencoded)数据格式不固定,不一定是名值对的方式,所以服务器无法知道具体的处理方式,所以只能通过获取原始数据流的方式来进行解析。
总结为:原生ajax如果不指定Context-type默认使用text/plain;charset=UTF-8,jquery的ajax则是application/x-www-form-urlencoded,而axios底层正是使用了原生的ajax,后端会对非Content-type不为application/x-www-form-urlencoded的请求做特殊处理,由此导致后端request.getParameter()无法接收。
解决方法:
1、不使用框架的情况下,使用原始的读取流的方式:
private String 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(); }
2、使用spring框架:
加入@RequestBody注解,如下:
@RequestMapping("xxx") public Result xxx(@RequestBody User user) { Result result = Result.getSuccessResult(); return result; }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/76521.html
摘要:最近做项目,做分页的功能,使用给后台发送数据,使用接口还是工具都可获取数据,唯独获取不到经过排除,发现这与的传参格式有关系在使用时,要注意到配置选项中包含和两者,以为他们是相同的,实则不然。因为是添加到的请求字符串中的,用于请求。 最近做vue项目,做分页的功能,使用post给后台发送数据,使用接口还是工具(postman)都可获取数据,唯独axios获取不到;经过排除,发现这与axi...
摘要:最近项目中使用也遇到了一些问题,就借此机会总结一下,如有错误,还请不吝指正。而在使用时对应的传参使用的是,是作为请求体发送的,同样使用这种形式的还有等请求方式。层在环境中可以使用。 Axios是一个基于Promise的 HTTP 库,可以用在浏览器和node.js 中,因为尤大大的推荐,axios也变得越来越流行。最近项目中使用axios也遇到了一些问题,就借此机会总结一下,如有错误,...
摘要:本文的目的在于探讨前后端数据交互,并给出不同的解决方案供大家参考。实际使用只需在配置文件配置其他配置其他组件配置以上就是前端处理和后端处理两种解决方案,可根据实际情况选择 一、前言 axios是vue项目中用来使用ajax技术来与后台交换数据的一个组件,在vue的作者推荐下,相当数量的vue前端开发人员开始使用它。但是在实际开发过程中,却时有出现后端接收不到前端post过来的数据的情况...
摘要:本文的目的在于探讨前后端数据交互,并给出不同的解决方案供大家参考。实际使用只需在配置文件配置其他配置其他组件配置以上就是前端处理和后端处理两种解决方案,可根据实际情况选择 一、前言 axios是vue项目中用来使用ajax技术来与后台交换数据的一个组件,在vue的作者推荐下,相当数量的vue前端开发人员开始使用它。但是在实际开发过程中,却时有出现后端接收不到前端post过来的数据的情况...
摘要:最近做项目,需要用到后台是第一次使用进行请求,本以为同一样,会很简单,但是结果往往不让人满意啊,请求很简单,这里就不说了,主要说下请求方式。以上只是个人的实践经过,有其他解决办法的,欢迎留言。 最近做项目,需要用到vue,后台是php,第一次使用axios进行请求,本以为同ajax一样,会很简单,但是结果往往不让人满意啊,get请求很简单,这里就不说了,主要说下 post请求方式。 使...
阅读 2094·2021-09-22 10:56
阅读 1367·2021-09-07 10:11
阅读 1781·2019-08-30 15:54
阅读 2274·2019-08-30 15:44
阅读 2294·2019-08-29 12:40
阅读 3010·2019-08-28 18:25
阅读 1713·2019-08-26 10:24
阅读 3167·2019-08-23 18:39