【问题标题】:Combine GET and POST request methods in Spring在 Spring 中结合 GET 和 POST 请求方法
【发布时间】:2013-08-01 23:34:06
【问题描述】:

我有一个支持GETPOST 请求的资源。这里是示例资源的示例代码:

@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 可以轻松组合这两种方法。我试过了,但是不行,因为这两种方法最后有不同的参数,即HttpServletRequestBindingResult@RequestParam不是必需的,因此在POST请求中不需要)。任何想法如何结合这两种方法?

【问题讨论】:

  • 为什么不将 LONG CODE 移到单独的方法中?
  • 如果这么长,你甚至应该把它分成几个短方法
  • 因为我正在寻找更优雅和通用的解决方案。我不认为我有一个方法 booksLogic 这是我在两个方法中唯一调用的方法。
  • @MilanMilanov:这将是最优雅的解决方案。拥有能够做好一件事并委托给其他短方法的短方法是您应该努力的目标。
  • 一般情况下,对于不改变服务器的事情,你使用 GET,而对于改变服务器的事情,你使用 POST。它们是数据库中 READ 和 WRITE 的等效 http 操作。因此,将它们分开并将通用逻辑拆分为不同的方法是理想的

标签: spring spring-mvc request-mapping httpverbs


【解决方案1】:
@RequestMapping(value = "/books", method = { RequestMethod.GET, 
RequestMethod.POST })
public ModelAndView listBooks(@ModelAttribute("booksFilter") BooksFilter filter,
     HttpServletRequest request) 
    throws ParseException {

//your code 
}

这适用于 GET 和 POST。

对于 GET,如果您的 pojo(BooksFilter) 必须包含您在请求参数中使用的属性

如下图

public class BooksFilter{

private String parameter1;
private String parameter2;

   //getters and setters

URl 应该如下所示

/books?parameter1=blah

像这样你可以将它用于 GET 和 POST

【讨论】:

    【解决方案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....);
    }
    

    【讨论】:

    • 我在问那个通用方法的签名。它怎么能同时接受HttpServletRequestBindingResult
    • 默认情况下,如果你没有提到任何映射方法 那么它会同时接受GET和POST请求,你只需要检查BindingResult的部分。需要探索。我认为它可以处理仍然需要检查的部分
    • 您可以在参数内接受 HttpServletRequest,此外,如果您在 BindingResult 上的数据较少,则使用 request.getParameter("paramName") 接受您的参数并检查适用于两者的条件。 (如果 BindingResult 给您带来问题,请尝试此操作,否则它会通过删除我认为的 RequestMethod 映射来工作)
    【解决方案3】:
    @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(required = true)那么你必须传递parameter1,parameter2

    使用 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
    }
    

    【讨论】:

    • 有什么方法可以找到requestGETPOST 的类型吗?
    • 可以查看请求头
    • SonarQube 发出警报 - 考虑将此方法列表缩小到一个。
    猜你喜欢
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    相关资源
    最近更新 更多