我们可以使用一种方法在Spring REST中处理HTTP POST和PUT吗

时间:2018-07-23 17:01:36

标签: spring-mvc spring-web

我们正在建立新的Rest服务。我有一个看起来像这样的PUT方法:

   @RestController
   public class RestController...
   .
   .
   @PutMapping("/api/entity1")
    public ResponseEntity<String> entity1Put(@RequestBody Myclass entity,
            @RequestParam(value = "node1", defaultValue = emptyString) String node1,
            @RequestParam(value = "user", defaultValue = emptyString) String user,
            @RequestParam(value = "password", defaultValue = emptyString) String password) {...}

该方法本质上是用于调用应用程序业务层的代理。我的POST方法将具有完全相同的签名,准备代码和返回类型。唯一的区别是在业务层调用的方法的名称。为了减少代码并提高API的一致性,我希望有一个方法可以处理PUT和POST请求。

可以这样做吗?

   @RestController
   public class RestController...
   .
   .
   @PutMapping("/api/entity1")
   @PostMapping("/api/entity1")
    public ResponseEntity<String> entity1PutandPost(@RequestBody Myclass entity,
            @RequestParam(value = "node1", defaultValue = emptyString) String node1,
            @RequestParam(value = "user", defaultValue = emptyString) String user,
            @RequestParam(value = "password", defaultValue = emptyString) String password) {...} 

如果是,那么我如何确定请求的HTTP方法?

1 个答案:

答案 0 :(得分:3)

我似乎因为提出一个愚蠢的问题而收到了“ -1”,但没关系。

在遵循@JB Nizet提供的一些指针之后,这里是一个解决方案。

更改1,使用一系列方法切换到RequestMapping。

变更2,是Spring的新手,我没有意识到如果您要求某些类型,运行时将注入它们。添加了HttpServletRequest参数,Spring忠实地提供了我需要的请求数据。

变更3更改了业务规则层,以接受方法名称作为参数,从而允许该层实现PUT和POST之间的语义差异。

结果,将来使用此代码的工程师将更有可能为PUT / POST维护一致的API。这项工作的有用副产品是,我们现在可以将性能指标以外的请求信息推送到我们的应用洞察服务中,并且代码保持简单。

@RequestMapping(path="/api/entity1", method={RequestMethod.PUT,RequestMethod.POST})
public ResponseEntity<String> entity1PutandPost(@RequestBody Myclass entity1,
        HttpServletRequest request,
        @RequestParam(value = "node1", defaultValue = emptyString) String node1,
        @RequestParam(value = "user", defaultValue = emptyString) String user,
        @RequestParam(value = "password", defaultValue = emptyString) String password) {

    try {
            BusLayer.processObject(request.getMethod(), entity1, creds);
    }