@RequestParam接收不到参数required string parameter ‘XXX‘is not present,后使用@RequestBody用实体类接收

@RequestParm用于绑定HTTP请求参数,可以是多个参数,也可以是一个Map集合,GET,POST均可@RequestParm中name属性是指定参数名,required属性默认为true,表示必传。若为false则为非必传。属性有defaultValue默认值选项,若该参数为null时,会将默认值填充到参数上。

@RequestParm相当于整合下面俩个方法的功能:

  • request.getParamter(String s)
    该方法和上面的注解功能相同,也是用来获取get或post方式传递的参数值,输出结果为String类型

  • request.getParamterMap()
    该方法是获取get或post提交的所有参数,并转为一个map,key是String类型,value是String数组,用来保存相同key的所有value。

@RequestParm支持POST,GET请求 只支持Content-Type: 为
application/x-www-form-urlencoded编码的内容。Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)

@RequestBody绑定一个对象实体

不支持get请求,因为get请求没有HttpEntity。必须要在请求头中申明content-Type(如application/json).springMvc通过HandlerAdapter配置的HttpMessageConverters解析httpEntity的数据,并绑定到相应的bean上
只能一个@RequestBody。可以与@RequestParam一起使用,但建议最好不要与@RequestParam一起使用,是因为@RequestBody会将InputStream吃掉,造成后面的@RequsetParam无法匹配到参数而报400

关于上述俩个注解的使用,我觉得有必要了解一下Form Data 和 Request Payload的区别;
前端开发中经常会用到AJAX发送异步请求,对于POST类型的请求会附带请求数据。而常用的两种传参方式为:Form Data 和 Request Payload

@RequestParam接收不到参数required string parameter ‘XXX‘is not present,后使用@RequestBody用实体类接收_第1张图片

@RequestParam接收不到参数required string parameter ‘XXX‘is not present,后使用@RequestBody用实体类接收_第2张图片

GET请求 使用get请求时,参数会以key=value的形式拼接在请求的url后面。例如:
但是受限于请求URL的长度限制,一般参数较少时会使用get请求。

POST请求 当参数数量较多,且对数据有一定安全性要求时,会考虑用post请求传递参数数据。POST请求的参数数据是在请求体中。

  • 方式一: Form Data形式 当POST请求的请求头里设置Content-Type: application/x-www-form-urlencoded(默认), 参数在请求体以标准的Form
    Data的形式提交,以&符号拼接,参数格式为key=value&key=value&key=value… 前端代码设置:
    在servlet中,后端可以通过request.getParameter(name)的形式来获取表单参数。

  • 方式二:Request Payload形式 如果使用AJAX原生POST请求,请求头里设置Content-Type:application/json,请求的参数会显示在Request
    Payload中,参数格式为JSON格式:{“key”:“value”,“key”:“value”…},这种方式可读性会更好。
    后端可以使用getRequestPayload方法来获取。

Form Data 和 Request Payload 区别
如果请求头里设置Content-Type: application/x-www-form-urlencoded,那么这个请求被认为是表单请求,参数出现在Form Data里,格式为key=value&key=value&key=value…
原生的AJAX请求头里设置Content-Type:application/json,或者使用默认的请求头Content-Type:text/plain;参数会显示在Request payload块里提交。

在SpringMVC里面@RequestParam和@RequestBody的区别就是根据这个来的,当我们通过Ajax进行数据传输的时候,如果前端HTTP请求的Body体传输的Form Data那么后端就可以通过@RequestParam来进行接收,这种对应的Content-Type’: ‘application/x-www-form-urlencoded’。
如果是Request Payload,那么对应Content-Type:application/json,这个时候如果使用@RequestParam来接收的后端会无法识别到参数,会报400的错误,这个时候需要使用@RequestBody来接收。

————————————————
版权声明:本文为CSDN博主「ZWZhangYu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Octopus21/article/details/107047988/

required string parameter 'XXX’is not present 的几种情况

情况一:原因是由于头文件类型不对,可以在MediaType中选择合适的类型,例如GET和POST

情况二:jquery提交delete时,不支持@RequestParam,只支持@PathVariable形式

情况三:若api在调用的时候,如果存在重类型,但不重名;例如:/id与/name,两者在类型上是一样的

情况四:这里提示Required String parameter ‘XXX’ is not
present并不一定是XXX的错,也有可能是后面的参数错误。总的来说就是页面传递的参数和后台接受参数名自不匹配。

情况五:传递的参数里面包含特殊符号,比如前台传递字符串不能包含逗号等。(待证明)

情况六:传的参数是undefined;

情况七:换一种请求方式试试,比如现在用的是POST提交方式,改为GET/PUT等其他方式。

————————————————
版权声明:本文为CSDN博主「qq_40391559」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40391559/article/details/82856868

你可能感兴趣的:(工作总结)