在项目中,Controller层通常接收前端参数的常用格式有两种:一种JSON数据格式,另一种是非JSON格式。项目组内当前使用的是前后端分离,前端传参大多为JSON格式,因此后端通常会选择简单JSON+HashMap和简单JSON+POJO的形式来接收前端参数。这两种方式能够满足大部分场景下参数传递的需求,覆盖了大约90%的请求方法。
非JSON格式的数据
1、同名参数
该方式直接将方法的参数名称与请求的参数名称保持一致来进行接收;
- 该方法适合请求参数较少的情况,一般是小于等于三个参数;
- 适合Get、Post等任何请求;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @description:请求参数测试
*/
@RestController
@RequestMapping("/reqParamTest")
public class ReqParamTest {
@RequestMapping("fun1")
public String fun1(String name, String code) {
String out = "fun1:" + name + code;
System.out.println(out);
return out;
}
}
测试结果
2、POJO类
封装一个bean直接来接收
- 提交的参数名称需要和类的属性保持一致
创建Bean
import lombok.Data;
@Data
public class ReqParamArea {
private String name;
private String code;
}
测试方法
import com.one.pojian.entity.po.ReqParamArea;
@RequestMapping("fun2")
public String fun2(ReqParamArea reqParamArea) {
String out = "fun2:" + reqParamArea.getName() + reqParamArea.getCode();
System.out.println(out);
return out;
}
测试结果
3、REST风格
- 请求参数要符合REST风格,形如:
fun3/中国/000000 - 使用注解
@PathVariable指定参数的映射规则
测试方法
@RequestMapping("fun3/{name}/{number}")
public String fun3(@PathVariable String name, @PathVariable("number") String code) {
String out = "fun3:" + name + code;
System.out.println(out);
return out;
}
测试结果
4、HttpServletRequest
测试方法
@RequestMapping("fun4")
public String fun4(HttpServletRequest httpServletRequest) {
String name = httpServletRequest.getParameter("name");
String code = httpServletRequest.getParameter("code");
String out = "fun4:" + name + code;
System.out.println(out);
return out;
}
测试结果
5、RequestParam
- 注解可以对参数进行非空校验
- 注解可以设置默认值
例如:
@RequestParam(value="id",required = false,defaultValue = "1"),该设置内容表示:不输入id值时,默认值为1 测试方法
@RequestMapping("fun5")
public String fun5(@RequestParam(name = "name1") String name, @RequestParam String code) {
String out = "fun5:" + name + code;
System.out.println(out);
return out;
}
测试结果
6、RequestParam + Map
测试方法
@RequestMapping("fun6")
public String fun6(@RequestParam Map<String, Object> map) {
String out = "fun6:" + map + map.get("name");
System.out.println(out);
return out;
}
测试结果
JSON格式的数据
1、简单JSON + POJO
将前端传递过来的JSON数据直接存储在POJO对象中。 测试方法
@RequestMapping("fun7")
public String fun7(@RequestBody ReqParamArea reqParamArea) {
String out = "fun7:" + reqParamArea.getName() + reqParamArea.getCode();
System.out.println(out);
return out;
}
测试结果
2、简单JSON + HashMap
测试方法
@RequestMapping("fun9")
public String fun9(@RequestBody HashMap paramsHashMap) {
String out = "fun9:" + paramsHashMap.get("name") + paramsHashMap.get("code");
System.out.println(out);
return out;
}
测试结果
3、复杂JSON
创建多个POJO类或者创建内部类,当前使用创建多个POJO类的方式进行测试,如下: 测试方法
import lombok.Data;
@Data
public class ReqParamCountry {
String name;
String code;
ReqParamProvince[] provinces;
}
import lombok.Data;
@Data
public class ReqParamProvince {
String name;
String code;
}
@RequestMapping("fun8")
public String fun8(@RequestBody ReqParamCountry reqParamCountry) {
String out = "fun8:" + reqParamCountry.getName() + reqParamCountry.getCode() +
reqParamCountry.getProvinces()[0].getName();
System.out.println(out);
return out;
}
测试结果