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 der gleiche, mit Ausnahme einer Variablendefinition. Die beiden Methoden können mit method = {RequestMethod.POST, RequestMethod.GET}
und einem einfachen if
Inneren leicht kombiniert werden . Ich habe es versucht, aber es funktioniert nicht, da die beiden Methoden am Ende einen unterschiedlichen Parameter haben, dh HttpServletRequest
und BindingResult
(die @RequestParam
sind nicht erforderlich und werden daher in der POST
Anforderung nicht benötigt ). Irgendwelche Ideen, wie man die beiden Methoden kombiniert?
booksLogic
, die das einzige ist, was ich in den beiden Methoden nenne.Antworten:
@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)
dann müssen Sie Parameter1, Parameter2 übergebenVerwenden Sie BindingResult und fordern Sie sie basierend auf 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 }
quelle
request
dhGET
oderPOST
kam?Im Folgenden finden Sie eine Möglichkeit, wie Sie dies erreichen können. Dies ist möglicherweise keine ideale Methode.
Lassen Sie eine Methode beide Anfragetypen akzeptieren, und überprüfen Sie dann, welche Art von Anforderung Sie erhalten haben. Ist sie vom Typ "GET" oder "POST", führen Sie die entsprechenden Aktionen aus und rufen Sie eine Methode auf, für die eine allgemeine Aufgabe ausgeführt wird beide Anforderungsmethoden 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....); }
quelle
HttpServletRequest
als auch akzeptierenBindingResult
?@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 Anforderungsparameter verwenden
Wie unten
public class BooksFilter{ private String parameter1; private String parameter2; //getters and setters
URl sollte wie folgt sein
/ books? parameter1 = bla
Auf diese Weise können Sie es sowohl für GET als auch für POST verwenden
quelle