常见的一个 web 服务,如何获取请求参数?
一般最常见的请求为 GET 和 POST,get 请求的参数在 url 上可以获取,post 请求参数除了 url 上还有可能在表单中,文件上传时,获取方式又和一般的参数获取不一样
本篇则主要集中在不同请求方式下,获取参数的使用姿势
首先需要搭建一个后端的请求,为了快速演示
利用 spring-boot 创建了一个机器简单的工程,依赖版本 1.5.4.RELEASE
I. GET 请求参数获取
get 请求参数,一般都是直接挂在请求的 url 上,所以获取这些参数还是比较简单的
1. 通过 HttpServletRequest 获取参数
这个可以说是最基本最常见的的方式了,javax.servlet.ServletRequest#getParameter 来获取对应的参数,下面各处一个实例
根据上面暴露的接口,我们测试的 case 就很简单了
说明
这是一个最基本的获取参数的方式,get,post 请求都适用的,通常在 filter,intercepter 中也是可以通过 HttpServletRequest 对象来获取请求参数
除了获取常见的请求参数之外,HttpServletRequest 可以获取请求头的完整信息
在一次请求的生命周期内,可以通过下面的方式获取 Request 对象 (当然也可以获取 response 对象)
2. 直接方法参数获取
直接给出 case, 这个方法依然是放在上面的 DemoController 下面的
请求验证
注意:
上面这种使用方式,相当于直接将 url 参数映射到了 Controller 方法的参数上了
方法参数名必须和 url 参数名完全一致(区分大小写)
顺序无关
若参数没传,则默认为 null
一个疑问
上面的 demo 中 Controller 的方法参数都是 String 还好,如果将 password 改成 int,会出现什么情况
代码稍作修改
实际测试
结果说明
如果请求参数与方法参数类型不一致,会抛出转换异常
如果方法参数为非封装基本类型,则 url 参数必须存在,否则报错
3. RequestParam 注解方式获取请求参数
通过 @RequestParam 注解获取参数的方式和上面的一种比较类似,case 如下
测试 case
说明
不指定注解的 name 或 value 属性时,等同于第二种使用姿势
注解的 name 属性或 value 属性,用实际的参数名来指定
controller 的参数名与 url 参数名没有强关联(区别第二种方式)
参数类型需要保证一致(通第二种方式)
如果 url 参数可选,请设置 require 属性为 false,如下
@RequestParam(name = "user", required = false) String username
4. Bean 方式获取参数
对于请求参数比较复杂的情况下,我比较喜欢这种使用姿势,管理起来方便简单
测试 case
说明
定义一个 bean,内部属性和请求参数对应
允许参数不存在的情况,会使用 null 代替(所以,尽量不要使用非封装基本类型,否则参数不传时,会抛异常)
bean 的属性,可以根据实际情况指定类型
5. ModelAttribute 注解方式
@ModelAttribute 注解的方法,会优于 Controller 之前执行,一般更常见于向视图传输数据使用,此处不详细展开,正常来讲,专门的获取参数不太会用这这种方式来玩
6. Path 参数
Path 参数,专指的是请求路径的参数,如
上面这个 url 中,password 是我们传统意义上的请求参数,其中 path 参数则是指其中 req4,demo 这种 path 路径中的一环;对此,最常见的一个 case 就是常见的博客中, 如开源中国的一个博客链接
566591 : 这个参数主要用来区分用户
1601400 : 这个参数则主要是表示对应的博文
一般 path 参数的获取方式如下
测试 case
注意:
path 参数的使用,需要确保参数存在且类型匹配
path 参数和 url 参数不会相互影响
II. POST 请求参数获取
POST 请求参数,更多的是看提交表单参数是否可以获取到,以及如何获取,主要的手段依然是上面几种方式,下面验证下是否 ok
1. HttpServletRequest 方式获取参数
测试 case,可以借助 curl 来实现 post 请求
curl 也可以换成 js 请求测试方式
说明
对于 HttpServletReuqest 方式获取参数时,get 和 post 没什么区别
若 url 参数和表单参数同名了,测试结果显示使用的是 url 参数(待确认,当然最好不要这么干)
2. 方法参数获取
几个测试 demo 如下
基本上使用姿势和 get 没什么区别
3. RequestParam 注解方式
注意
和前面的两种方式不同的是,当 post 表单的参数和 url 参数同名时,会合并成一个字符串
4. Bean 方式
这种方式不区分 get,post,所以完全复杂的交互接口,完全可以考虑用 bean 的方式来定义请求参数
5. PathVariable
这个没法玩...
III. 多媒体上传参数获取
上传文件的支持,对于传统的 spring-mvc 来说,可能需要一些添加一些相关配置,不在本文的范畴内,下面默认已经配置好
实例支持
简单来说,主要是利用 HttpServletRequest 来获取上传的文件
注意:
如果接口必须要求上传文件,可以直接把参数声明为 MultipartHttpServletRequest, 此时调用方如果不传参数,会被异常拦截(可以通过 @ControllerAdvice 来拦截全局异常)
如果可以不上传文件,则可以用上面的这种猥琐姿势,内部进行判断
((MultipartHttpServletRequest) request).getFile(xxx) 来获取指定名的上传文件
IV. 小结
1. 五种获取参数的姿势
方式 注意事项
HttpServletRequest 获取参数 最常见通用
方法参数与请求参数同名 注意参数名统一,注意类型一致,尽量不用非包装基本类型
@RequestParam 注解 同上,可注解内指定 http 参数名
Bean 方式 定义一个 bean,会将同名的 http 参数赋值进去,推荐
@PathVariable 注解 请求 url 参数
2. 传文件使用姿势
使用 MultipartHttpServletRequest 来获取上传的文件,当然也可以获取基本的请求参数
V. 其他
声明
尽信书则不如,已上内容,纯属一家之言,因本人能力一般,见解不全,如有问题,欢迎批评指正
来源: http://www.bubuko.com/infodetail-2461801.html