springboot处理请求参数的方式

写这篇博文的原因是, 我发现, 在处理前端发送过来的数据的时候, 总是会遇到不同的请求参数情形, 对所有的参数处理情况无法良好运用, 所以, 需要总结会出现的各种情况, 以便下次使用时方便, 而不需要花费太多的时间去思考

 

1 集中常见的接收参数的方法:

 参见此篇文章

 上述文章列举出了常使用的集中接收参数的方法, 对于GET方式的请求基本都适用, 但是对于POST方式的请求有时不太适用, 原因详见 2

 

2 POST请求特殊点:

  HTTP协议约定POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式(不是指字符编码),由开发者自行决定。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。因此POST 提交数据方案, 包含了 Content-Type 以声明消息主体编码方式

 

  主要有四种方式:

  (1)application/x-www-form-urlencoded
    最常见的 POST 提交数据的方式了。浏览器的原生 <form> 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。
    此方式的编码方式:首先,Content-Type 被指定为 application/x-www-form-urlencoded;其次,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码,

    这种post提交方式, 会适用于上述几种获取参数的方式, 包括适用RequestParam注解, 比较符合正常的获取请求中的参数

  (2)multipart/form-data
    使用表单上传文件时,必须让 <form> 表单的 enctype 等于 multipart/form-data。 Content-Type 里指明了数据是以 multipart/form-data 来编码,上面提到的这两种 POST 数据的方式,都是浏览器原生支持的,而且现阶段标准中原生 <form> 表单也只支持这两种方式(通过 <form> 元素的 enctype 属性指定,默认为 application/x-www-form-urlencoded。其实 enctype 还支持 text/plain,不过用得非常少)。

    这种post方式是用于文件上传, 不作为此篇讨论的范畴, 详细参见 文件上传 

 

     (3) application/json

     使用application/json这个Content-Type作为响应头, 用来告诉服务端消息主体是序列化的json字符串, 这种方案, 可以方便的提交复杂的结构化数据, 特别适合Restful的接口

     这种post提交方式也是比较常见, 不过, 后端接收参数的话, 就会有很大的不同之处

     上述的几种获取请求参数的方式就不再适用了, 不过还好, 有其它相应的解决办法

     springboot提供了一种用于转化原生post请求参数的注解, ----> RequestBody()

     这个注解会将请求中的json格式的参数转换为相应的实体类或者封装到Map对象中, 两者都比较常用

     @RequestBody Map<String, String> map, 这种方式会将json中的参数按照键值对的方式封装到map中, 我们可以直接通过map.get("参数名")的方式获取到参数值,

     @RequestBody Bean bean, 这种方式会将json中的参数封装到我们自定义的Bean中, 但是需要自定义Bean的属性名与参数名保持相同, 要是不同的话可能会报错或者无法接收到数据

     

     另外, 还有一种最原始的解决方案, 就是通过HttpServletRequest类直接获取到其中的参数, 不过这好像会牵扯到流的问题, 需要使用json的转化工具, 暂不详述

 

   (4) text/xml

     这个鬼东西好像没有遇见过, 暂时不讨论, 以后用到在总结

 

 

3 几种特殊的接收请求参数的方式适用范围总结:

   (1) RequestParam()注解: ---> GET请求, 普通表单格式提交的post请求(见2中的(1))

      被注解的参数, 可以是普通数据类型, 也可以是自定义Bean数据类型, 也可以是数组数据类型, 也可以是Map数据类型 (这四种数据类型适用性都非常高)

   (2) PathVarible()注解: ---> GET请求, POST请求, 但是要求参数写在url中, 而且需要被{...}包围, /user/{id}/{username}

   (3) RequestBody()注解: ---> POST请求, 主要是为了处理json格式的参数

      被注解的类型可以是自定义Bean, 也可以是Map数据类型 , 也可以是数组数据类型 (如果json格式数据中包含数组的话)(这三种的适用性 都非常高)

 

   (4) 无需注解, 直接函数中接收参数, 这种方式局限性较高, 需要参数名与请求参数名完全对应才行, 也没有办法处理json格式的参数数据

 

 

参见: 

  https://blog.csdn.net/TheGreatButton/article/details/107717595

  https://blog.csdn.net/yalishadaa/article/details/68937141

 

posted @ 2021-03-29 14:48  0龙行者0  阅读(1074)  评论(0编辑  收藏  举报