@RequestParam
@RequestParam: RequestHeader, 즉 요청 헤더에서 수신합니다. 일반적으로 GET 요청에 사용됩니다(예: http://localhost:8080/hello/name=admin&age=18).
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}
GET 요청
@GetMapping("/hello")
public String hello(@RequestParam(name = "id") Long id){
System.out.println("hello " + id);
return "hello message";
}
@RequestParam은 인코딩된
Content-Type
콘텐츠를 처리하는 데 사용되며 기본값은 이 속성입니다.application/x-www-form-undencoded
Content-Type
@RequestParam은 POST, DELETE 및 기타 요청과 같은 다른 유형의 요청에도 사용할 수 있습니다 .
POST 요청
@RequestParam은 로 인코딩된 콘텐츠를 Content-Type
처리하는 application/x-www-form-urlencoded
Postman에서 본문 유형을 로 선택해야 자동으로 x-www-form-urlencoded
헤더의 Content-Type
인코딩 application/x-www-form-urlencoded
형식 으로 변경됩니다. 아래 그림과 같이:
@PostMapping("/save")
public String hello(@RequestParam(name = "id") Long id,
@RequestParam("name") String name,
@RequestParam("password") String password){
System.out.println(user);
return "hello message";
}
프런트에서 전달하는 매개변수가 3개가 아니라 10개라면 계속해서 @RequestParam을 사용하여 요청 매개변수를 수신하면 10개의 @RequestParam이 필요하므로 코드 가독성이 매우 떨어지며 매개변수 유형이 마찬가지로 오류가 발생하기 쉽습니다. 따라서 전달된 매개변수를 받기 위해 엔티티 클래스를 사용하지만 @RequestParam은 엔티티 클래스를 직접 전달하는 방식을 지원하지 않습니다.
@Data
public class User {
@NotNull(message = "id不能为空")
private Long id;
@NotBlank(message = "名字不能为空")
private String name;
@NotBlank(message = "密码不能为空")
private String password;
}
// @RequestParam 不支持直接传递实体类的方式,所以可以在实体类中做数据校验,使用 @Validated 注解使得作用在实体类属性上的注解生效
@PostMapping("/save")
public String save(@Validated User user){
System.out.println(user);
return "hello success";
}
// console result: User(id=110, name=admin, password=123456)
json
대신 문자열을 사용하여 값을 전달할 경우 유형을 로 설정 application/json
하고 보내기를 클릭하면 오류가 보고되며 백그라운드에서 값을 받을 수 없습니다.null
// console result: User(id=null, name=null, password=null)
@요청 본문
@RequestBody 어노테이션에서 수신한 매개변수는 requestBody , 즉 요청 본문 에서 가져옵니다 . 일반적 으로 다음과 같은 인코딩되지 않은 형식의 데이터 및 기타 유형의 데이터를 처리 하는 데 사용됩니다 .Content-Type: application/x-www-form-urlencoded
application/json
application/xml
데이터 유형에 관한 한 application/json
@RequestBody 주석을 사용하여 본문의 모든 json 데이터를 백엔드로 전송하면 백엔드가 이를 파싱합니다.
@PostMapping("/saveBatch")
public String saveBatch(@RequestBody @Validated List<User> list){
list.forEach(System.out::println);
return "saveBatch success";
}
// console result:
// User(id=1, name=admin, password=123456)
// User(id=2, name=cheny, password=cheny)
지도로 전달
@PostMapping("/listMap")
public String saveMap(@RequestBody List<Map<String, String>> listMap){
for (Map<String, String> map : listMap) {
System.out.println(map);
}
return "listMap success";
}
// console result:
// {id=1, name=admin}
// {id=2, age=18}
요약하다
주석 @RequestParam에 의해 수신된 매개변수는 requestHeader , 즉 요청 헤더 에서 옵니다 . 일반적으로 GET 요청에 사용되며 POST, DELETE 등과 같은 다른 유형의 요청도 사용할 수 있습니다.
@RequestBody 어노테이션에서 수신한 매개변수는 requestBody , 즉 요청 본문 에서 가져옵니다 . 일반적 으로 다음과 같은 인코딩되지 않은 형식의 데이터 및 기타 유형의 데이터를 처리 하는 데 사용됩니다 . 일반적으로 POST, DELETE 및 기타 유형의 요청 데이터를 수신하는 데 사용되며 GET 유형도 적용될 수 있습니다.Content-Type: application/x-www-form-urlencoded
application/json
application/xml
- GET 요청에서는 @RequestBody를 사용할 수 없습니다.
- POST 요청에서 @RequestBody와 @RequestParam을 사용할 수 있지만 @RequestBody를 사용할 경우 매개변수 변환 구성을 통일해야 한다.
- 여러 @RequestParam을 사용하여 데이터를 가져올 수 있지만 @RequestBody는 사용할 수 없습니다.
예를 들어 SpringMVC에 구성된 HttpMessageConverters 처리 스택에서 Date를 'yyyy-MM-dd'로 변환하는 것과 같은 json 변환 형식을 지정하고 파라미터 수신 객체에 포함된 필드가 Date 타입인 경우 클라이언트만 전달 형식은 년, 월, 일이며 시, 분, 초는 전달할 수 없습니다. 인터페이스가 다르기 때문에 매개 변수는 시간 매개 변수에 대한 형식 요구 사항이 다를 수 있으므로 클라이언트 호출 동료가 매개 변수 형식에 대해 약간 혼란스러워 확장성이 높지 않습니다.
@RequestParam을 사용하여 매개변수를 허용하는 경우 매개변수를 허용하는 모델에서 @DateFormat을 설정하여 시간 매개변수를 허용하는 데 필요한 형식을 지정할 수 있습니다.
또한 @RequestBody에서 수락한 매개변수는 Servlet에서 변환되지 않고 요청 객체의 Param 매개변수 집합에 배치되므로 @RequestParam이 가능합니다.
요약하면 일반적으로 @RequestParam 주석을 사용하여 Http 요청 매개변수를 수락하는 것이 좋습니다.
참조
@RequestParam 및 @RequestBody 주석 사용 시나리오 - Tencent Cloud Developer Community - Tencent Cloud