【问题标题】:Can I create multiple HTTP POST methods with same request mapping with different requestbody我可以使用不同的请求体创建具有相同请求映射的多个 HTTP POST 方法吗
【发布时间】:2017-02-02 06:03:03
【问题描述】:

我可以创建多个 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 中处理这个问题。

【问题讨论】:

标签: java spring-boot http-post


【解决方案1】:

是的,您可以对具有不同请求正文的相同端点 URI 使用 POST Http 方法,并且您可以获得不同的响应。实现此目的的一种方法是使用端点 URI + Headers 映射请求

例如

@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
    }

}

在这种情况下,BillingController 中的两个类方法都映射到相同的 HTTP 方法 (POST) 和 URI (/api/bills)。一旦您将发布请求指向 /api/bills,标头操作将决定调用 BillingController 中的哪个类方法

如何打BillingController.addBill?

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

【讨论】:

    【解决方案2】:

    您必须为此选择。

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

      • 如果你有 url,你可以使用参数字段。

        @RequestMapping(value="/path", params="id") 公共字符串 test1(@RequestBody RBody 正文) {}

        @RequestMapping(value="/path", params="name") 公共字符串 test2(@RequestBody RBody 正文) {}

    【讨论】:

    • Spring中没有@Consumes注解。如果您指的是RequestMappingconsumes 字段,它仅适用于媒体类型,不适用于Java 类型。
    • 我提到了consumes字段,我没有提到Java类型。
    • 这个问题没有提到任何关于不同媒体类型的内容;它与不同的 Java 类型有关:一种接受RBody 并返回RObjet,另一种接受RBody2 并返回RObjet2。强制 api 使用不同的媒体类型只是为了让它工作似乎是一种不恰当的 hack,而不是一种可能的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    相关资源
    最近更新 更多