在Spring中结合GET和POST请求方法

在Spring中结合GET和POST请求方法,spring,spring-mvc,request-mapping,httpverbs,Spring,Spring Mvc,Request Mapping,Httpverbs,我有一个支持GET和POST请求的资源。下面是示例资源的示例代码: @RequestMapping(value = "/books", method = RequestMethod.GET) public ModelAndView listBooks(@ModelAttribute("booksFilter") BooksFilter filter, two @RequestParam parameters, HttpServletRequest request) throws Pars

我有一个支持
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
请求中不需要)。如何将这两种方法结合起来,有什么想法吗?

下面是实现这一目标的方法之一,可能不是理想的方法

让一个方法接受这两种类型的请求,然后检查您收到的请求类型是“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....);
}
如果
@RequestParam(required=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
}
这将适用于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....);
}
对于GET,如果pojo(BooksFilter)必须包含在请求参数中使用的属性

如下

public class BooksFilter{

private String parameter1;
private String parameter2;

   //getters and setters
URl应该如下所示

public class BooksFilter{

private String parameter1;
private String parameter2;

   //getters and setters
/书籍?参数1=废话


这样你就可以在GET和POST中使用它了

为什么不把你的长代码移到一个单独的方法中呢?如果它太长,你甚至应该把它分成几个短方法,因为我正在寻找一个更优雅、更通用的解决方案。我不认为我有一个方法
booksLogic
,这是我在这两个方法中唯一调用的方法。@MilanMilanov:这将是最优雅的解决方案。拥有一个能很好地完成一件事并委托给其他短方法的短方法是您应该努力的目标。通常,对于不改变服务器的事情,使用GET,对于改变服务器的事情,使用POST。它们是在数据库中读写的等价http操作。因此,理想的做法是将它们分开,并将通用逻辑拆分为不同的方法。我要求的正是该通用方法的签名。。它如何同时接受
HttpServletRequest
BindingResult
?默认情况下,如果您没有提到任何映射方法<@RequestMapping(value=“/books”)>,那么它将同时接受GET和POST请求,您需要检查的唯一部分是BindingResult。我们需要探索一下。我认为它可以处理这个部分,但仍然需要检查您可以在参数内部接受HttpServletRequest,而且,如果BindingResult上的数据较少,那么可以使用request.getParameter(“paramName”)接受您的参数,并通过条件进行检查,这两种方法都适用。(如果BindingResult给了问题,那么只需通过删除请求方法映射,我想)有没有办法找到哪种类型的<代码>请求<代码> IE代码>获取<代码> >或代码> POST <代码>?你可以检查请求标题。SONARQUBE提高警报-考虑把这个方法列表缩小到一个。