Java 我可以用不同的requestbody创建多个具有相同请求映射的HTTP POST方法吗

Java 我可以用不同的requestbody创建多个具有相同请求映射的HTTP POST方法吗,java,spring-boot,http-post,Java,Spring Boot,Http Post,我可以用不同的requestbody创建多个具有相同请求映射的HTTP POST方法吗 @RequestMapping("api/v1/") @RequestMapping(value = "test" ,method = RequestMethod.POST) public RObjet create(@RequestBody RBody rbody) { // do some process... } @RequestMapping("api/v1/") @RequestMap

我可以用不同的requestbody创建多个具有相同请求映射的HTTP POST方法吗

@RequestMapping("api/v1/")
@RequestMapping(value = "test" ,method = RequestMethod.POST)
public RObjet create(@RequestBody RBody rbody)
{  
 // do some process...  
} 

@RequestMapping("api/v1/")
@RequestMapping(value = "test" ,method = RequestMethod.POST)
public RObjet2 create2(@RequestBody RBody2 rbody)
{  

  // do something.  

} 

这可能吗。?我们如何在spring boot中处理此问题。

您必须选择此选项

  • 可以使用consumes字段。您可以使用不同的消费类型

    • 如果url中有参数,则可以使用参数字段

      @请求映射(value=“/path”,params=“id”) 公共字符串test1(@RequestBody-RBody-body){}

      @请求映射(value=“/path”,params=“name”) 公共字符串test2(@RequestBody-RBody-body){}


是的,您可以对具有不同请求主体的相同端点URI使用POST Http方法,也可以得到不同的响应。实现这一点的一种方法是使用端点URI+头映射请求

e、 g

在本例中,BillingController中的两个类方法都映射到相同的HTTP方法(POST)和URI(/api/bills)。header操作驱动一旦将post请求指向/api/bills,将调用BillingController中的类方法

如何点击BillingController.addBill?


注意:我知道良好的REST API设计规定,如果我想删除记录,我应该使用delete方法,但是创建此示例只是为了参考,以说明如何使用相同的URI/方法来处理2个不同的端点。

检查此项在Spring中没有
@Consumes
注释。如果您指的是
RequestMapping
consumes
字段,那么它只适用于媒体类型,而不适用于Java类型。我指的是
consumes
字段,我没有提到Java类型。这个问题没有提到任何关于不同媒体类型的内容;它涉及不同的Java类型:一个接受
RBody
并返回
RObjet
,另一个接受
RBody2
并返回
RObjet2
。强制api使用不同的媒体类型只是为了让它工作似乎是一种不恰当的攻击,而不是一种可能的解决方案。
@RestController
@RequestMapping("/api/bills")
public class BillingController {

    @RequestMapping(method = RequestMethod.POST, headers = "action=add-bill")
    public BillId addBill(@Valid @RequestBody BillingData data) {
        //Some code
    }

    @RequestMapping(method = RequestMethod.POST, headers = "action=delete-bill-by-id")
    @ResponseStatus(code = HttpStatus.NO_CONTENT)
    public void removeBill(@Valid @RequestBody BillId identifier) {
        //Some code here to remove bill
    }

}