web-dev-qa-db-fra.com

Combinez GET et POST méthodes de demande au printemps

J'ai une ressource qui prend en charge les demandes GET et POST. Voici un exemple de code pour un exemple de ressource:

@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
}

Le code dans les deux méthodes est pratiquement le même, à l’exception d’une définition de variable. Les deux méthodes peuvent être facilement combinées à l'aide de method = {RequestMethod.POST, RequestMethod.GET} et d'une simple if à l'intérieur. J'ai essayé, mais cela ne fonctionne pas, car les deux méthodes ont un paramètre différent à la fin, c'est-à-dire HttpServletRequest et BindingResult (les @RequestParam ne sont pas requis et ne sont donc pas nécessaires dans la demande POST. Des idées comment combiner les deux méthodes?

53
user1120144
@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
}

si @RequestParam(required = true), alors vous devez passer paramètre1, paramètre2 

Utilisez BindingResult et demandez-les en fonction de vos conditions.

L'autre côté  

@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
}
76
Prabhakaran

Vous trouverez ci-dessous l’un des moyens d’atteindre cet objectif. Ce n’est peut-être pas une solution idéale.

Demandez à une méthode d’accepter les deux types de demande, puis vérifiez quel type de demande vous avez reçu, s’il s’agit de type "GET" ou "POST", une fois que vous savez cela, effectuez les actions respectives et appelez la méthode qui effectue la tâche commune les deux méthodes de demande, à savoir GET et 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....);
}
6
Jayesh
@RequestMapping(value = "/books", method = { RequestMethod.GET, 
RequestMethod.POST })
public ModelAndView listBooks(@ModelAttribute("booksFilter") BooksFilter filter,
     HttpServletRequest request) 
    throws ParseException {

//your code 
}

Cela fonctionnera pour GET et POST.

Pour GET si votre pojo (BooksFilter) doit contenir l'attribut que vous utilisez dans le paramètre de requête

comme ci-dessous

public class BooksFilter{

private String parameter1;
private String parameter2;

   //getters and setters

URl devrait être comme ci-dessous

/ livres? paramètre1 = bla

De cette façon, vous pouvez l’utiliser pour GET et POST.

0
MPPNBD