@RequestBody 및 @RequestParam 주석에 대한 자세한 설명

@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-undencodedContent-Type

@RequestParam은 POST, DELETE 및 기타 요청과 같은 다른 유형의 요청에도 사용할 수 있습니다 .

POST 요청

@RequestParam은 로 인코딩된 콘텐츠를 Content-Type처리하는 application/x-www-form-urlencodedPostman에서 본문 유형을 로 선택해야 자동으로 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/jsonapplication/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 , 즉 요청 본문 에서 가져옵니다 . 일반적 으로 다음과 같은 인코딩되지 않은 형식의 데이터 및 기타 유형의 데이터를 Content-Type: application/x-www-form-urlencoded처리 하는 데 사용됩니다 . 일반적으로 POST, DELETE 및 기타 유형의 요청 데이터를 수신하는 데 사용되며 GET 유형도 적용될 수 있습니다.application/jsonapplication/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

@RequestBody와 @RequestParam의 차이점은 포괄적이고 상세합니다.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_46058921/article/details/127794325
conseillé
Classement