除了创建资源之外,在POST api中做其他事情是否被认为是RESTful?

时间:2017-08-02 19:18:45

标签: rest api restful-architecture

我们有客户注册API,接受姓名,电子邮件和移动,并生成customerId,即:

{ 
  "name": "john",
  "email": "john@gmail.com",
  "mobile": "+134325325" 
}

我们为此API点击创建客户记录。可以从多个客户和表单创建客户。我们有一个新的要求,如果我们得到这个"客户创造"从特定表格记录,我们需要将此信息(姓名,电子邮件,手机)+(customerId)发送给某些第三方API。

我认为,根据非常实际的说法,这个API应该只创建"客户"而不是做那些只对某些客户/表格有效的额外事情。

在这种情况下,哪个是最佳选择:

  1. 为此新要求创建新API:此新API首先会创建客户,然后将其发送给第三方API。这符合我们的要求,但客户创建逻辑现在有两个API。
  2. 使用现有的"客户注册API"通过添加一个新标志:我们将从这些表单中设置此标志,我们有这个新要求也将数据发送给第三方。我们首先创建客户,如果设置了标志,我们也会将此数据发送给第三方API。但这种方法是RESTful吗?
  3. 从我们需要向第三方API发送数据的这些表单中,首先将请求发送到"客户注册API"并获取customerId,然后将这些详细信息发送给第三方API:这将是缓慢的,因为我们将不得不在客户端等待customerId。

3 个答案:

答案 0 :(得分:1)

POST通常用作不适合REST API的操作的全能。批量创建,更新或删除,合并记录,登录,复制等都是常见的例子。但是你需要做的其他事情与PUT不相对应,GET或DELETE通常会因POST而过载。只需确保为每次使用POST使用不同的URL。

即。 POST / foo应该创建一个foo,POST / bulk_delete应该根据查询或表单参数删除几个fooa。

答案 1 :(得分:0)

我不觉得这里有适合的独立资源。我们假设我们讨论的不是API端点设计,而是简单的class方法createCustomer。公开新端点与创建新的重载方法createCustomerSpecific相同。这是RPC - 样式 - 方法的数量将继续增长。

样式的REST建议使用相同的方法,但封装在输入对象中创建资源所需的所有数据。

对我来说,你的案例应该由存储库工厂驱动:你的应用程序逻辑知道要调用哪个存储库 - 简单CustomerRepositoryCustomerWithNotificationRepository

答案 2 :(得分:0)

我希望这个问题的拥有者可能不需要这个答案。但这是我的想法。

我的假设如下,

您有CustomerService类,其中包含使用Customer Data执行CRUD操作的方法。

您有一个端点/ api / customers(方法:POST),它将调用CustomerService.create()方法在DB中创建客户详细信息。

使用您的第二种方法(轻微修改):

我不想创建另一个端点,因为除了调用第三方API之外我们没有做任何不同的事情。因此,请求JSON将被修改,如下所示,以保存来自客户端的附加数据。



    {
        "clientData": {
            "notify": "true"
        },
        "customer": {
            "name": "john",
            "email": "john@gmail.com",
            "mobile": "+134325325"
        }
    } 


创建客户后,我们必须检查通知字段是否为真。如果是,那么将使用客户详细信息调用第三方API以进行其他处理。