webentwicklung-frage-antwort-db.com.de

Kombinieren Sie GET und POST Anforderungsmethoden im Frühling

Ich habe eine Ressource, die sowohl GET als auch POST -Anfragen unterstützt. Hier ein Beispielcode für eine Beispielressource:

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

Der Code in den beiden Methoden ist praktisch derselbe, mit Ausnahme einer Variablendefinition. Die beiden Methoden lassen sich mit method = {RequestMethod.POST, RequestMethod.GET} und einer einfachen if innen einfach kombinieren. Ich habe es versucht, aber es funktioniert nicht, weil die beiden Methoden am Ende einen anderen Parameter haben, dh HttpServletRequest und BindingResult (die @RequestParams sind nicht erforderlich und werden daher nicht benötigt POST Anfrage). Haben Sie Ideen, wie Sie die beiden Methoden kombinieren können?

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
}

wenn @RequestParam(required = true), müssen Sie Parameter1, Parameter2 übergeben 

Verwenden Sie BindingResult und fordern Sie sie entsprechend Ihren Bedingungen an.

Der andere Weg  

@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

Im Folgenden ist eine der Möglichkeiten, wie Sie dies erreichen können, möglicherweise nicht ideal.

Wenn eine Methode beide Arten von Anforderungen akzeptiert, prüfen Sie, welche Art von Anforderung Sie erhalten haben. Ist dies der Typ "GET" oder "POST", führen Sie die entsprechenden Aktionen aus und rufen Sie eine Methode auf, für die eine gemeinsame Aufgabe ausgeführt wird Beide fordern Methoden an, dh GET und 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 
}

Dies funktioniert sowohl für GET als auch für POST.

Für GET, wenn Ihr Pojo (BooksFilter) das Attribut enthalten muss, das Sie im Parameter request verwenden

wie unten

public class BooksFilter{

private String parameter1;
private String parameter2;

   //getters and setters

URL sollte wie folgt sein

/ books? parameter1 = blah

Auf diese Weise können Sie es sowohl für GET als auch für POST verwenden

0
MPPNBD