POST请求参数已经传过来取不到请求参数 Content-Type引发的服务端收不到HTTP请求参数

编程知识 更新时间:2023-04-05 07:17:23

问题现象:

前端POST请求参数已经传过来了,Java后端Debug也能进到请求里,可就是取不到请求参数。

不同的原因就在于Content-Type设置不同。

HTTP Content-Type 用于标识传输数据的类型。在请求中,Content-Type告诉服务端实际请求内容的类型;在响应中,Content-Type告诉客户端实际返回内容的类型。

HTTP定义的Content-Type类型有近200种(https://www.w3cschool/http/ahkmgfmz.html),其中最常用的是以下三种:

1、application/x-www-form-urlencoded

请求参数在Form Data中,只能上传键值对,并且键值对都是间隔分开的。

参数形式:  name1=value1&name2=value2

2、multipart/form-data

请求参数在Request Payload中,既可以上传文件等二进制数据,也可以上传表单键值对,只是最后会转化为一条信息。

浏览器将表单内的数据和文件放在一起发送。这种方式会定义一个不可能在数据中出现的字符串作为分隔符,然后用它将各个数据段分开。

3、application/json

请求参数在Request Payload中

参数形式: {key1:value1,key2:value2}

重点:对应以上三种类型Java服务端获取请求参数的方法也不同(伪代码)

1、application/x-www-form-urlencoded

1)注解@RequestParam(value="name1") String name1  

2)注解@ModelAttribute 绑定请求参数到指定对象

3)HttpServletRequest.getParameter("name1")

2、multipart/form-data

流HttpServletRequest.getInputStream()或者HttpServletRequest.getReader()

3、application/json

1)注解@RequestBody 

2)流HttpServletRequest.getInputStream()或者HttpServletRequest.getReader()

Tips: request.getParameter()、 request.getInputStream()、request.getReader()这三种方法是有冲突的,因为流只能被读一次,所以只有第一次能取到参数。

其他

jQuery在执行post请求时,会默认设置Content-Type为application/x-www-form-urlencoded,所以服务器能够正确解析,

而使用原生ajax请求时,如果不显示的设置Content-Type,那么默认是text/plain,这时服务器就不知道怎么解析数据了,所以才只能通过获取原始数据流的方式来进行解析请求数据。

jQuery中的dataType指的是预期服务器返回的数据类型,而不是发送的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML。这样服务端返回json数据,前端就会获取不到返回值。

更多推荐

POST请求参数已经传过来取不到请求参数 Content-Type引发的服务端收不到HTTP请求参数

本文发布于:2023-04-05 07:17:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/66918fadba76e6408d5975e37d12a151.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:参数   经传   服务端   收不到   POST

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 45498文章数
  • 14阅读数
  • 0评论数