POST请求参数已经传过来取不到请求参数 Content 您所在的位置:网站首页 java的上下文为什么取不到值 POST请求参数已经传过来取不到请求参数 Content

POST请求参数已经传过来取不到请求参数 Content

2023-11-05 10:08| 来源: 网络整理| 查看: 265

问题现象:

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

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

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

HTTP定义的Content-Type类型有近200种(https://www.w3cschool.cn/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数据,前端就会获取不到返回值。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有