同一方法中使用GET和POST的RestController?

9
我想创建一个单一的方法,并在其中配置GET + POST,使用spring-mvc:
@RestController
public class MyServlet {
    @RequestMapping(value = "test", method = {RequestMethod.GET, RequestMethod.POST})
    public void test(@Valid MyReq req) {
          //MyReq contains some params
    }
}

问题:使用上述代码,任何POST请求都会导致一个空的MyReq对象。
如果我将方法签名更改为@RequestBody @Valid MyReq req,则post请求有效,但GET请求失败。
那么,如果将bean用作输入参数,是否可以在同一方法中同时使用get和post?

1
如果您发送的JSON与GET请求不太常见,因为通常它没有正文而只有参数。请求正文!=请求参数。因此,您要么使用绑定或序列化,而不是两者兼用。 - M. Deinum
为什么你想做这样的事情?这没有太多意义,因为GET和POST HTTP方法具有不同的目的/语义。 - Jesper
我不会将JSON作为GET发送。我会将URL查询参数作为GET发送,将JSON数组作为POST发送。 - membersound
不,这是不可能的。 请访问以下链接:https://dev59.com/-2Qm5IYBdhLWcg3wyhZE - LONGHORN007
如上所述,params和body是不同的东西,需要分开处理。您将需要两个单独的方法。一个用于传入的JSON,另一个用于请求参数。 - M. Deinum
3个回答

10

解决您问题的最佳方案似乎是这样的:

@RestController
public class MyServlet {
    @RequestMapping(value = "test", method = {RequestMethod.GET})
    public void testGet(@Valid @RequestParam("foo") String foo) {
          doStuff(foo)
    }
    @RequestMapping(value = "test", method = {RequestMethod.POST})
    public void testPost(@Valid @RequestBody MyReq req) {
          doStuff(req.getFoo());
    }
}

根据您接收请求数据的方式,您可以以不同的方式处理请求数据并调用相同的方法来执行业务逻辑。


3
@RequestMapping(value = "/test", method = { RequestMethod.POST,  RequestMethod.GET })
public void test(@ModelAttribute("xxxx") POJO pojo) {

//your code 
}

这将适用于POST和GET。 (确保首先是POST,然后是GET)

对于GET,您的POJO必须包含您在请求参数中使用的属性,例如下面所示:

像这样:

public class POJO  {

private String parameter1;
private String parameter2;

   //getters and setters

URL应该像下面这样:

/test?parameter1=blah

这样你就可以同时将其用于GET和POST了。


1
抱歉,但那不是真的。它适用于GET请求,但不适用于POST请求! - membersound

2

我无法在同一方法中使其工作,我想知道解决方案,但这是我的解决方法,与luizfzs的不同之处在于您使用相同的请求对象而不是使用@RequestParam。

@RestController
public class Controller {
    @GetMapping("people")
    public void getPeople(MyReq req) {
        //do it...
    }
    @PostMapping("people")
    public void getPeoplePost(@RequestBody MyReq req) {
        getPeople(req);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接