在 Spring 中结合 GET 和 POST 请求方法
Posted
技术标签:
【中文标题】在 Spring 中结合 GET 和 POST 请求方法【英文标题】:Combine GET and POST request methods in Spring 【发布时间】:2013-08-01 23:34:06 【问题描述】:我有一个支持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
请求中不需要)。任何想法如何结合这两种方法?
【问题讨论】:
为什么不将 LONG CODE 移到单独的方法中? 如果这么长,你甚至应该把它分成几个短方法 因为我正在寻找更优雅和通用的解决方案。我不认为我有一个方法booksLogic
这是我在两个方法中唯一调用的方法。
@MilanMilanov:这将是最优雅的解决方案。拥有能够做好一件事并委托给其他短方法的短方法是您应该努力的目标。
一般情况下,对于不改变服务器的事情,你使用 GET,而对于改变服务器的事情,你使用 POST。它们是数据库中 READ 和 WRITE 的等效 http 操作。因此,将它们分开并将通用逻辑拆分为不同的方法是理想的
【参考方案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....);
【讨论】:
我在问那个通用方法的签名。它怎么能同时接受HttpServletRequest
和BindingResult
?
默认情况下,如果你没有提到任何映射方法 那么它会同时接受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
【讨论】:
有什么方法可以找到request
即GET
或POST
的类型吗?
可以查看请求头
SonarQube 发出警报 - 考虑将此方法列表缩小到一个。以上是关于在 Spring 中结合 GET 和 POST 请求方法的主要内容,如果未能解决你的问题,请参考以下文章
Spring Security Config 可能有啥问题?获取与 POST