Web服务请求参数配置

753 阅读6分钟

「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

使用SpringBoot框架开发Web应用时,通常需要后端编写相关的接口暴露出来作为HTTP服务,由前端浏览器访问并获取或提交相关数据,最终显示包含后端数据的页面信息。

1. Web服务

前后端的请求基本都是基于HTTP来完成的,而在对后端服务接口进行请求时,前端需要对请求内容进行相应的处理以满足服务接口的需求,如设置请求方式、请求头信息、请求体信息等。

1.1 请求方式

常用的HTTP请求类型有:

  • GET请求:GET请求用来获取指定资源,通过直接访问URL路径即可实现资源的获取
  • POST请求:POST请求用于对资源路径提交数据来完成相应的请求,一般在请求中携带相关数据信息
  • PUT、DALETE等:基本和POST方式一致

对于GET和POST请求方式的不同之处,需要注意的内容有:

  1. GET和POST并没有本质上的区别,都是基于HTTP传输协议,通常约定用于不同的请求类型
  2. GET请求参数跟在URL之后,明文展示,在请求后浏览器会对请求进行缓存,数据不太安全
  3. POST数据隐藏在请求体中进行提交,浏览器不会缓存,但是回退时会重新请求数据
  4. GET请求携带参数过长时,尽管HTTP没有对URL的长度限制,但是浏览器通常会限制URL长度
  5. GET请求也可以使用请求体传参,但是可能因为类型原因而不去请求体种获取数据

因此,在实际使用时,还是要遵循GET和POST的特点,来分别使用合适的请求方式。

1.2 参数传递方式

SpringBoot开发提供的服务中,发起请求并传入参数的方式通常有:

  1. url拼接参数,在请求地址之后拼接参数与对应值的字符串,也即常见的Params参数传递
  2. 数据表单提交方式,x-www-from-urlencoded,通常用于web页面表单数据的提交,提交时数据以key-value的方式放入请求中传递给服务接口
  3. json源格式提交数据,以json格式的字符串定义参数信息,并在请求时放入请求体Body中,后端接收json格式参数后,通过解析的方式获取参数内容

2. 参数传递

2.1 URL拼接(简单参数、GET请求)

URL拼接是GET请求常用的参数传递方式,通常是在指定的请求路径后使用?=&等符号来拼接参数名和参数值,拼接的参数在请求到服务接口后可以通过参数名获取到对应的值。

拼接参数的URL可以描述为:http://localhost:8080/getInfo?id=155&name=tom

  • ?代表之后的URL部分作为拼接参数的内容
  • =用来对参数名称赋予参数值
  • &表示多个参数之间的连接符号
  • 原则上参数可以拼接足够多,但是要注意URL的长度不要超出浏览器等的限制长度

对于服务端接收URL中拼接的参数时,可以有如下定义,接收请求时会根据服务接口中定义的参数在URL中找到参数名对应的数据值。

//服务接口定义信息,通过URL拼接获取参数
@RequestMapping("/getInfo")
public String index(String id, String name){
    return "id:" + id + ",name:" + name;
}

注意:使用该URL拼接传参时,传入参数和服务接口参数不对应时仍然可以请求成功,如果根据机制获取不到数据,则对应参数为null,URL中多传入的参数不做任何处理。

2.2 @RequestParam注解

数据表单提交即在web页面中将表单中填写内容作为值,表格字段作为见我,将页面数据以键值对的形式提交到服务接口中。

在SpringBoot框架中,通常使用@RequestParam注解标注方法的参数,以此指定参数接收表单提交数据中的对应内容。

使用@RequestParam注解注解时,需要注意该注解有属性值可以设置:

  • value,用于接收请求中的参数值,定义的名称要和参数名一致才可以获取对应数据
  • required,默认为true,表示注解的参数在URL中必须传递,如果不传则会报错,可设置为false
  • defaultValue,即注解参数的默认值

使用@RequestParam注解定义接口参数时,如果参数名称和URL中数据key名称一致,可以省略注解中的calue值,如果不同则需要使用value值来关联绑定数据。具体接口参数定义可以表示为:

@RequestMapping("/getInfoByRequestParams")
public String getInfoByRequestParams(@RequestParam("id") String userId,
                                     @RequestParam("name") String name){
    return "userId:" + userId + ",name:" + name;
}

@RequestParam用于处理HTTP请求头中Content-Type类型为application/x-www-form-urlencoded的内容,这也是POST请求时Content-Type的默认编码类型,此类型表示表单数据以键值对方式传递。

可以使用postman工具模拟此种类型的请求,访问定义的服务接口,结果显示为: image.png

对于@RequestParam注解需要针对每个参数进行配置,如果请求的参数过多时,在接口种定义太多的参数不符合规范,虽然@RequestParam可以定义对象的属性字段并使用对象接收请求参数,但是这种方式仍然比较繁琐。

对于接收多个、批量的参数需求,可以使用更加方便的@RequestBody注解。

2.3 @RequestBody注解

@RequestBody注解更是一个出场率非常高的注解了,现在前后端的交互请求基本都是通过json进行传递,而使用json字符串时就需要使用@RequestBody来定义接收参数格式。

POST请求头Content-Type为application/json时,请求参数以json字符串存放在请求体Body中,此时使用@RequestBody注解用来处理请求。

使用@RequestBody定义的参数会以json格式获取参数内容,如果当前参数是一个Java对象,而对象属性和参数字符串的key值匹配,则参数值会自动配置到对象中。详细的使用流程如下:

//定义服务接口,使用@RequestBody注解标注一个Java对象
@RequestMapping("/getInfoByRequestBody")
public String getInfoByRequestBody(@RequestBody User user){
    return "user:" + user;
}

同样使用postman工具请求接口,选择raw->JSON以保证Content-Type为application/json编码格式,输入JSON格式参数,发起请求。

image.png

需要注意,在创建Java对象来接收JSON格式参数时,要保证对象存在无参构造方法,否则会不能创建对象而报错。