복붙노트

[SPRING] Spring에서 GET 및 POST 요청 메소드 결합

SPRING

Spring에서 GET 및 POST 요청 메소드 결합

GET 및 POST 요청을 모두 지원하는 리소스가 있습니다. 샘플 리소스에 대한 샘플 코드는 다음과 같습니다.

@RequestMapping(value = "/books", method = RequestMethod.GET)
public ModelAndView listBooks(@ModelAttribute("booksFilter") BooksFilter filter, two @RequestParam parameters, HttpServletRequest request)
    throws ParseException {
        LONG CODE
}


@RequestMapping(value = "/books", method = RequestMethod.POST)
public ModelAndView listBooksPOST(@ModelAttribute("booksFilter") BooksFilter filter, BindingResult result)
        throws ParseException {
        SAME LONG CODE with a minor difference
}

두 가지 방법의 코드는 변수 정의를 제외하고는 실질적으로 동일합니다. 두 메소드는 method = {RequestMethod.POST, RequestMethod.GET}을 사용하여 쉽게 결합 할 수 있으며, 내부는 간단한 if를 사용할 수 있습니다. 시도했지만 작동하지 않습니다. 두 메소드의 끝에 다른 매개 변수 즉 HttpServletRequest 및 BindingResult (@ RequestParam이 필요하지 않으므로 POST 요청에 필요하지 않음)가 있기 때문입니다. 어떤 아이디어를 두 가지 방법을 결합하는 방법?

해결법

  1. ==============================

    1.

    @RequestMapping(value = "/testonly", method = { RequestMethod.GET, RequestMethod.POST })
    public ModelAndView listBooksPOST(@ModelAttribute("booksFilter") BooksFilter filter,
            @RequestParam(required = false) String parameter1,
            @RequestParam(required = false) String parameter2, 
            BindingResult result, HttpServletRequest request) 
            throws ParseException {
    
        LONG CODE and SAME LONG CODE with a minor difference
    }
    

    @RequestParam (필수 = true)이면 매개 변수 1, 매개 변수 2를 전달해야합니다.

    BindingResult를 사용하고 조건에 따라 요청하십시오.

    다른 방법

    @RequestMapping(value = "/books", method = RequestMethod.GET)
    public ModelAndView listBooks(@ModelAttribute("booksFilter") BooksFilter filter,  
        two @RequestParam parameters, HttpServletRequest request) throws ParseException {
    
        myMethod();
    
    }
    
    
    @RequestMapping(value = "/books", method = RequestMethod.POST)
    public ModelAndView listBooksPOST(@ModelAttribute("booksFilter") BooksFilter filter, 
            BindingResult result) throws ParseException {
    
        myMethod();
    
        do here your minor difference
    }
    
    private returntype myMethod(){
        LONG CODE
    }
    
  2. ==============================

    2.아래는 당신이 그것을 달성 할 수있는 방법 중 하나이며, 이상적인 방법은 아닐 수도 있습니다.

    아래는 당신이 그것을 달성 할 수있는 방법 중 하나이며, 이상적인 방법은 아닐 수도 있습니다.

    한 가지 방법으로 두 가지 유형의 요청을 모두 받아 들인 다음 어떤 유형의 요청을 받았는지, 유형이 "GET"인지 "POST"인지 확인한 다음 해당 작업을 수행하고 일반적인 작업을 수행하는 한 가지 방법을 호출하십시오. 두 메소드 모두 GET과 POST를 요청한다.

    @RequestMapping(value = "/books")
    public ModelAndView listBooks(HttpServletRequest request){
         //handle both get and post request here
         // first check request type and do respective actions needed for get and post.
    
        if(GET REQUEST){
    
         //WORK RELATED TO GET
    
        }else if(POST REQUEST){
    
          //WORK RELATED TO POST
    
        }
    
        commonMethod(param1, param2....);
    }
    
  3. ==============================

    3.

    @RequestMapping(value = "/books", method = { RequestMethod.GET, 
    RequestMethod.POST })
    public ModelAndView listBooks(@ModelAttribute("booksFilter") BooksFilter filter,
         HttpServletRequest request) 
        throws ParseException {
    
    //your code 
    }
    

    이것은 GET과 POST 모두에 적용됩니다.

    당신의 pojo (BooksFilter)가 요청 매개 변수에서 사용중인 속성을 포함해야한다면 GET을 위해

    아래처럼

    public class BooksFilter{
    
    private String parameter1;
    private String parameter2;
    
       //getters and setters
    

    UR1은 아래와 같아야합니다.

    / books? parameter1 = blah

    이렇게하면 GET과 POST 모두에 사용할 수 있습니다.

  4. from https://stackoverflow.com/questions/17987380/combine-get-and-post-request-methods-in-spring by cc-by-sa and MIT license