SpringBoot和SpringCloud feign 接口请求参数类型
一、介绍
在日常开发过程中难免都会使用到接口进行参数传递,大部分情况只是单个或多个参数进行传递,有一些特殊情况可能需要其他类型参数比如数组,对象,对象集合等。
二、参数类型
1、基本参数:
a、HttpServletRequest request:接受参数(不推荐)
代码介绍:
// A服务接口
@PostMapping(value="/getUserDto",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public String getUserDto(HttpServletRequest request){
String token = request.getParameter("token");
// 其他业务逻辑
}
// B服务 feign接口
@PostMapping(value="/baseinfo/getUserDto")
String getUserDto(@RequestParam("token") String token);
// B服务接口
@PostMapping(value="/getUserDto",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public List<UserDto> getUserDto(HttpServletRequest request){
String token = request.getParameter("token");
String value = baseInfoApi.getUserDto(token);
return value;
}
b、@RequestParam:接受参数(推荐)
代码介绍
// A服务接口
@PostMapping(value="/getUserDto1",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public UserDto getUserDto1(@RequestParam("token") String token,
@RequestParam("money") Integer money){
log.info("====>>>> token:{},money{}",token,money);
UserDto u1 = new UserDto();
u1.setAge(11);
u1.setName("yyy");
return u1;
}
// B服务 feign接口
@PostMapping(value="/baseinfo/getUserDto1")
UserDto getUserDto1(@RequestParam("token") String token,
@RequestParam("money") Integer money);
// B服务接口
@PostMapping(value="/getUserDto1",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public UserDto getUserDto1(@RequestParam("token") String token,
@RequestParam("money") Integer money){
log.info("====>>>> token:{},money{}",token,money);
UserDto u1 = baseInfoApi.getUserDto1(token,money);
return u1;
}
总结:@RequestParam后面还有其他一些属性,比如该参数是否必须存在还有就是可以设置一个默认的值当前台接口没有传递该参数时。
@RequestParam(value="", required=true, defaultValue="")
博客推荐:https://blog.csdn.net/siwuxie095/article/details/79407123
c、@RequestParam Map<String,Object> map :当参数过多时可以这样编写
代码介绍:
// A服务接口
@PostMapping(value="/getUserDto5",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public UserDto getUserDto5(@RequestParam Map<String,Object> map){
// 打印map中的key和value
for (Map.Entry<String, Object> entry : map.entrySet()) {
System.out.println("Key = " + entry.getKey() + ", Value = " +entry.getValue());
}
UserDto u1 = new UserDto();
u1.setAge(11);
u1.setName("yyy");
return u1;
}
// B服务 feign接口
@PostMapping(value="/baseinfo/getUserDto5")
UserDto getUserDto5(@RequestBody Map<String,Object> map);
// B服务接口
@PostMapping(value="/getUserDto5",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public UserDto getUserDto5(@RequestParam Map<String,Object> map){
for (Map.Entry<String, Object> entry : map.entrySet()) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
UserDto u1 = new UserDto();
u1.setAge(11);
u1.setName("yyy");
return u1;
}
2、对象参数(当请求参数过多时,使用基本参数接受代码繁琐)
a、@RequestBody:接受对象参数
代码介绍:
// A服务接口
@PostMapping(value="/getUserDto2",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public UserDto getUserDto2(@RequestBody UserDto userDto){
log.info("====>>>> userDto:{}",userDto);
UserDto u1 = new UserDto();
u1.setAge(11);
u1.setName("yyy");
return u1;
}
// B服务feign接口
@PostMapping(value="/baseinfo/getUserDto2")
UserDto getUserDto2(@RequestBody UserDto userDto);
// B服务接口
@PostMapping(value="/getUserDto2",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public UserDto getUserDto2(@RequestBody UserDto userDto){
log.info("====>>>> userDto:{}",userDto);
UserDto u1 = baseInfoApi.getUserDto2(userDto);
return u1;
}
b、@ModelAttribute:注解类型将参数绑定到Model对象(不常用)
总结:@RequestParam、@RequestBody和@ModelAttribute区别参见以下博客:
https://www.cnblogs.com/zeroingToOne/p/8992746.html
2.1、对象中嵌套其他对象时
@RequestBody:接受对象参数
前台传参格式:
后台接口接受参数还是和上面一样
3、对象集合(请求参数为多个对象)
@RequestBody:接受对象参数
代码介绍:
// A服务接口
@PostMapping(value="/getUserDto3",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public UserDto getUserDto3(@RequestBody List<UserDto> userList){
log.info("====>>>> userList:{}",userList);
UserDto u1 = baseInfoApi.getUserDto3(userList);
return u1;
}
// B服务feign接口
@PostMapping(value="/baseinfo/getUserDto3")
UserDto getUserDto3(@RequestBody List<UserDto> userDto);
// B服务接口
@PostMapping(value="/getUserDto3",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public UserDto getUserDto3(@RequestBody List<UserDto> userList){
log.info("====>>>> userList:{}",userList);
UserDto u1 = baseInfoApi.getUserDto3(userList);
return u1;
}
前台传参格式:
注意事项:
该方法仅支持POST的方式,会使用到json2.js这个类库,注意设置contentType:"application/json"这个属性,否则会报415未知的类型异常
4、数组集合
@RequestBody:接受数组对象集合
代码介绍:
// A服务接口
@PostMapping(value="/getUserDto4",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public UserDto getUserDto4(@RequestBody String[] names){
for(String s:names){
System.out.println("====>>>>"+s);
}
UserDto u1 = new UserDto();
u1.setAge(11);
u1.setName("yyy");
return u1;
}
// B服务feign 接口
@PostMapping(value="/baseinfo/getUserDto4")
UserDto getUserDto4(@RequestBody String[] names);
// B服务接口
@PostMapping(value="/getUserDto4",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public UserDto getUserDto4(@RequestBody String[] names){
for(String s:names){
System.out.println("====>>>>"+s);
}
UserDto u1 = baseInfoApi.getUserDto4(names);
return u1;
}
前台传参格式:
注意事项:
注意contentType:"application/json",否则同样的415错误。
5、其他类型传参:(URL地址传参、session、cookie)
参见博客:https://blog.csdn.net/z69183787/article/details/41653843