目录
一丶Restful风格的常用四种请求方式
1、GET [select]
2、PUT [update]
3、POST [inser]
4、DELETE [delete]
二丶SpringBoot后端接口请求参数映射方式详解
1.映射基本类型参数
2.映射对象类型参数
3.1 映射数组
3.2 映射Collection
3.3 映射List
3.4 映射Set
2.映射数组、集合类型参数
2.1 映射数组
2.2 映射Collection
2.3 映射List
2.4 映射Set
表单参数方式
1.映射基本类型参数
2.映射对象类型参数
3.映射数组、集合类型参数
3.1 映射数组
3.2 映射Collection
3.3 映射List
3.4 映射Set
FormData方式
请求体json方式
一丶Restful风格的常用四种请求方式
1、GET [select]
请求会向数据库发索取数据的请求,从而来获取信息,其只是用来查询一下数据,不会修改、增加数据,不会影响资源的内容。无论进行多少次操作,结果都是一样的。
2、PUT [update]
请求是向服务器端发送数据的,从而改变信息,其用来修改数据的内容,但是不会增加数据的种类等,无论进行多少次PUT操作,其结果并没有不同。
3、POST [inser]
请求同PUT请求类似,都是向服务器端发送数据的,但是该请求会改变数据的种类等资源.几乎目前所有的提交操作都是用POST请求的。
4、DELETE [delete]
请求是用来删除某一个资源的。
POST主要作用在一个集合资源之上的(url),而PUT主要作用在一个具体资源之上的(url/xxx).如URL可以在客户端确定,那么可使用PUT,否则用POST。
一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。
二丶SpringBoot后端接口请求参数映射方式详解
在SpringBoot项目中,前端HTTP请求中的参数如何映射到Controller层的接口方法中的参数?这里针对各种方式做一个测试与总结,测试采用的SpringBoot版本号为2.2.10.RELEASE
QueryString
参数传递的方式为,在请求URL中直接拼接请求参数,如URL?param1=value1¶m2=value2
QueryString
参数传递方式对于请求方法GET
、POST
、PUT
、PATCH
、DELETE
都适用
1.映射基本类型参数
可以在Controller的接口中声明基本类型的参数,然后用@RequestParam
注解修饰,指定前端传递的参数名称
@RestController
@RequestMapping("param")
@Slf4j
public class RequestParamTestController {
@RequestMapping("queryString1")
public void testQueryString1(@RequestParam("name") String name, @RequestParam("age") Integer age) {
log.info("name:{} age:{}", name, age);
}
}
测试结果如下
如果请求参数名称和Controller中接口方法的参数名称一致,那么可以省略@RequestParam注解。不过一般还是建议加上
当请求参数名称和Controller中接口方法的参数名称一致时,加与不加@RequestParam的区别是:
加上@RequestParam,其属性required默认为true,那么当前端不传递对应的参数时将会抛出异常
不加
@RequestParam
,前端可以不传递对应参数,此时Controller接口方法中的参数接收到的值为null
2.映射对象类型参数
定义一个对象,属性名称和前端传递的参数名称一致即可
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private Integer age;
}
然后将Controller接口方法中的参数声明为自定义对象
@RequestMapping("queryString2")
public void testQueryString2(User user) {
log.info("name:{} age:{}", user.getName(), user.getAge());
}
测试结果如下
3.映射数组、集合类型参数
前端有2种方式针对同一个参数传递多个值:
在请求的QueryString中,拼接多个参数名称一样的参数即可,如URL?param=value1¶m=value2¶m=value3
在请求的QueryString中,对同一个参数赋多个值,多个值之间用,隔开,如URL?param=value1,value2,value3
3.1 映射数组
在Controller接口方法中声明数组类型参数,用@RequestParam指明前端传递的参数名称即可
@RequestMapping("queryString3")
public void testQueryString3(@RequestParam("name") String[] nameArray) {
if (nameArray != null) {
for (String name : nameArray) {
log.info(name);
}
}
}
测试结果如下
如果请求参数名称和Controller中接口方法的参数名称一致,那么可以省略
@RequestParam
注解。不过一般还是建议加上
3.2 映射Collection
在Controller接口方法中声明Collection
类型参数,用@RequestParam
指明前端传递的参数名称即可
@RequestMapping("queryString4")
public void testQueryString4(@RequestParam("name") Collection<String> nameCollection) {
if (nameCollection != null) {
log.info("类型:{}", nameCollection.getClass());
for (String name : nameCollection) {
log.info(name);
}
}
}
测试结果如下
可以发现框架默认采用的实现类是LinkedHashSet
。那我们继续测试传递相同value的时候是否也会采用这个实现
可以发现传递多个相同value的时候框架采用的实现类还是
LinkedHashSet
,所以有去重的效果
3.3 映射List
在Controller接口方法中声明List
类型参数,用@RequestParam
指明前端传递的参数名称即可
@RequestMapping("queryString5")
public void testQueryString5(@RequestParam("name") List<String> nameList) {
if (nameList != null) {
log.info("类型:{}", nameList.getClass());
for (String name : nameList) {
log.info(name);
}
}
}
测试结果如下
可以发现框架默认采用的实现类是
ArrayList
3.4 映射Set
在Controller接口方法中声明Set
类型参数,用@RequestParam
指明前端传递的参数名称即可
@RequestMapping("queryString6")
public void testQueryString6(@RequestParam("name") Set<String> nameSet) {
if (nameSet != null) {
log.info("类型:{}", nameSet.getClass());
for (String name : nameSet) {
log.info(name);
}
}
}
测试结果如下
可以发现框架默认采用的实现类是LinkedHashSet,与声明为Collection类型时一致
注意:
也可以在自定义对象中将属性声明为数组、集合类型,来接收多个值
对于映射Collection、List和Set类型参数时,即便前端提交的QueryString中的参数名称与Controller接口方法的参数名称一致,也不能省略@RequestParam注解,否则会抛出如下异常
路径参数方式
路径传参方式是将参数直接包含在URL路径中,比如URL/paramValue1/paramValue2
路径参数方式对于请求方法GET、POST、PUT、PATCH、DELETE都适用
1.映射基本类型参数
在Controller中用如下步骤接收参数:
1.在接口对应的请求路径中用{参数名}形式标出路径参数
2.在接口方法的参数上标注@PathVariable指名对应路径参数的参数名
@RequestMapping("path1/{name}/{age}")
public void testPath1(@PathVariable("name") String name, @PathVariable("age") Integer age) {
log.info("name:{} age:{}", name, age);
}
测试结果如下
如果接口方法上@RequestMapping中路径参数的参数名称和接口方法的参数名称相同,可以省略@PathVariable注解。但一般推荐加上
2.映射数组、集合类型参数
直接给路径参数多个值,用,隔开即可
2.1 映射数组
在Controller接口方法中声明数组类型参数,用@PathVariable指明路径参数的名称即可
@RequestMapping("path2/{name}/{age}")
public void testPath2(@PathVariable("name") String[] nameArray, @PathVariable("age") Integer[] ageArray) {
for (String name : nameArray) {
log.info(name);
}
for (Integer age : ageArray) {
log.info(age.toString());
}
}
测试结果如下
2.2 映射Collection
在Controller接口方法中声明Collection
类型参数,用@PathVariable
指明路径参数的名称即可
@RequestMapping("path3/{name}/{age}")
public void testPath3(@PathVariable("name") Collection<String> nameCollection, @PathVariable("age") Collection<Integer> ageCollection) {
log.info("类型:{}", nameCollection.getClass());
for (String name : nameCollection) {
log.info(name);
}
for (Integer age : ageCollection) {
log.info(age.toString());
}
}
测试结果如下
可以发现框架默认采用的类型是
LinkedHashSet
2.3 映射List
在Controller接口方法中声明List
类型参数,用@PathVariable
指明路径参数的名称即可
@RequestMapping("path4/{name}/{age}")
public void testPath4(@PathVariable("name") List<String> nameList, @PathVariable("age") List<Integer> ageList) {
log.info("类型:{}", nameList.getClass());
for (String name : nameList) {
log.info(name);
}
for (Integer age : ageList) {
log.info(age.toString());
}
}
测试结果如下
框架采用的实现类是
ArrayList
2.4 映射Set
在Controller接口方法中声明Set
类型参数,用@PathVariable
指明路径参数的名称即可
@RequestMapping("path5/{name}/{age}")
public void testPath5(@PathVariable("name") Set<String> nameSet, @PathVariable("age") Set<Integer> ageSet) {
log.info("类型:{}", nameSet.getClass());
for (String name : nameSet) {
log.info(name);
}
for (Integer age : ageSet) {
log.info(age.toString());
}
}
测试结果如下
框架采用的实现类是LinkedHashSet
路径参数方式映射到Controller接口方法中的数组、Collection、List和Set类型参数时,即便路径中的参数名称和接口方法中的参数名称一致,也不能省略@PathVariable注解
表单参数方式
表单参数方式要求在请求头中携带Content-Type,值为application/x-www-form-urlencoded,并且请求体中以param:value形式携带参数,每行代表一个参数,多个参数就有多行
注意:表单参数方式不适用于
GET
请求,适用于POST
、PUT
、PATCH
、DELETE
1.映射基本类型参数
可以在Controller的接口中声明基本类型的参数,然后用@
RequestParam
注解修饰,指定请求体中的参数名称
@RequestMapping("form1")
public void testForm1(@RequestParam("name") String name, @RequestParam("age") Integer age) {
log.info("name:{} age:{}", name, age);
}
测试结果如下
2.映射对象类型参数
定义一个对象,属性名称和请求体中的参数名称一致即可
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private Integer age;
}
然后将Controller接口方法中的参数声明为自定义对象
@RequestMapping("form2")
public void testForm2(User user) {
log.info("name:{} age:{}", user.getName(), user.getAge());
}
测试结果如下
3.映射数组、集合类型参数
请求体中的参数如果想要传递多个值,有2种方式:
- 直接给参数多个值,用
,
隔开即可 - 声明多个参数名一样的参数
3.1 映射数组
在Controller接口方法中声明数组类型参数,用@RequestParam
指明请求体中的参数名称即可
@RequestMapping("form3")
public void testForm3(@RequestParam("name") String[] nameArray) {
for (String name : nameArray) {
log.info(name);
}
}
测试结果如下
3.2 映射Collection
在Controller接口方法中声明Collection
类型参数,用@RequestParam
指明请求体中的参数名称即可
@RequestMapping("form4")
public void testForm4(@RequestParam("name") Collection<String> nameCollection) {
log.info("类型:{}", nameCollection.getClass());
for (String name : nameCollection) {
log.info(name);
}
}
测试结果如下
3.3 映射List
在Controller接口方法中声明List
类型参数,用@RequestParam
指明请求体中的参数名称即可
@RequestMapping("form5")
public void testForm5(@RequestParam("nameList") List<String> nameList) {
log.info("类型:{}", nameList.getClass());
for (String name : nameList) {
log.info(name);
}
}
测试结果如下
3.4 映射Set
在Controller接口方法中声明Set
类型参数,用@RequestParam
指明请求体中的参数名称即可
@RequestMapping("form6")
public void testForm6(@RequestParam("name") Set<String> nameSet) {
log.info("类型:{}", nameSet.getClass());
for (String name : nameSet) {
log.info(name);
}
}
测试结果如下
也可以在自定义对象中将属性声明为数组、集合类型,来接收多个值
FormData方式
用于文件上传。要求在请求头中携带Content-Type,值为multipart/form-data。请求体中可以携带普通参数,也可以携带文件
Postman测试发现这种方式适用于GET、POST、PUT、PATCH、DELETE,但浏览器一般只能用POST表单提交进行文件上传,所以建议用POST请求
可以在Controller的接口中分别声明普通类型参数和文件类型参数,其中文件类型参数必须是MultipartFile类型,然后用@RequestParam注解修饰,指定请求体中对应的参数名称
@RequestMapping("formData1")
public void testFormData1(@RequestParam("fileName") String fileName, @RequestParam("file")MultipartFile file) {
log.info("{}:{}", fileName, file.getSize());
}
测试结果如下
FormData方式中的普通参数(即非文件类型参数)同样也可以利用数组、集合类型接收多个值,可以封装为自定义对象,方法与表单参数方式类似
请求体json方式
要求请求头携带Content-Type
,值为application/json
。请求体中的内容为json格式
在Controller的接口方法映射这种请求参数只能通过自定义对象,自定义对象的属性名称要与请求体中json的属性名称一致,然后将自定义对象作为接口方法的参数,并标注@RequestBody
注解,框架会自动将请求体的json转换为自定义对象
@RequestMapping("json1")
public void testJson1(@RequestBody User user) {
log.info(user.toString());
}
测试结果如下
文章来源:https://www.toymoban.com/news/detail-803864.html
经过PostMan测试发现,用
GET
方法发送这种请求也可以顺利接收到参数,但是一般浏览器不支持GET
请求携带请求体数据,所以还是建议实际开发中只针对POST
、PUT
、PATCH
、DELETE
采用这种方式进行参数映射文章来源地址https://www.toymoban.com/news/detail-803864.html
到了这里,关于Restful风格请求 后端接口参数接收详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!