使用Post更新RESTful值

时间:2009-10-15 20:46:54

标签: rest

我是REST的新手,请原谅我,如果这是一个愚蠢的问题。

所以,我有一个客户资源。客户有很多学分。所以,我想一个获得客户信用的URL将是

客户/ 21 /币

(其中21是客户ID)

现在,如果我没有足够的学分,如何添加学分?例如。一个客户有10个学分,我想添加5.据我了解,如果我使用帖子,我会做类似的事情:

客户/ 21 /积分?金额= 15(这是否正确?)

但是,如果我只想添加到现有的积分怎么办?那就是我想发送5个学分,然后将它们添加到客户目前拥有的任何内容中?我是否定义了一种幻像资源,例如addedCredits?

客户/ 21 / addedCredits?量= 5

然后在幕后,我只做积分+ = 5?

4 个答案:

答案 0 :(得分:2)

您需要定义如何处理系统中的“信用”;无论您是否打算将它们定义为资源或客户资源的属性,这都很重要。

在下面的示例中,我将使用XML来表示资源/实体。这可能适合您,但您需要在请求和响应中使用一些一致的方式来表示资源 - 这有助于您避免使用查询参数(例如http://example.com foo = bar )定义属于请求主体的数据。

表示信用的几种方式:

  1. 如果您的“客户”的“信用”属性

    <customer id="21">
      <balance>10</balance><!-- aka credit -->
    </customer>
    

    然后你也可以只是获取客户,更新客户的信用/余额,然后将<customer>返回/customer/21

  2. 如果“信用”是自己的资源

    您可以将以下内容发布到/credit

    <credit>
      <dateApplied>2009-10-15 15:00:00</dateApplied>
      <customer href="/customer/21"/>
      <amount>5</amount>
    </credit>
    

    或者您可以将以下内容发布到/customer/21/credits(假设URI是应用于客户的所有<credit>的列表):

    <credit>
      <dateApplied>2009-10-15 15:00:00</dateApplied>
      <amount>5</amount>
    </credit>
    

    这会将新的<credit>“追加”到现有列表中。并且还消除了在实体中提供<customer>的需要,因为它已经存在于URI中。

答案 1 :(得分:1)

我会使用相同的网址。

使用名为 extraCredit 的POST变量设置为 5 ,向customer/21/credits发送POST。 POST应该用于annotation of existing resources(或创建从属资源)。您没有理由需要新的URL。

如果个人信用是您系统中值得拥有自己网址的资源,那么从POST到customer/21/credits的响应网址应包含新信用资源的网址,例如: customer/21/credit/12

您可以将POST的XML表示定义为POST customer/21/credits,但在这个简单的示例中我不认为值得。 REST有效负载不必是XML。

customer/21/addedCredits?amount=5这样的网址对我来说没有意义,因为它并没有真正识别资源。如果有人向customer/21/addedCredits?amount=5发出GET,你还会给他们什么?

你应该做的一件事就是当有人获得像customer/21/addedCredits?amount=5这样的网址时,更改客户资源的状态。由于你的问题标题承认你需要使用POST,你可能会意识到这一点。 GET应该是安全,这意味着发出GET不应该改变资源的状态。

答案 2 :(得分:0)

最终,实施取决于您。 WHile URI查询参数通常不受欢迎,但这并不意味着您不能使用它们。就个人而言,我会使帖子URI类似于:

  

客户/ 21 /币/添加/ 5

但没有什么说你不能做你喜欢的事情或者:

  

客户/ 21 /币/添加α值= 5

答案 3 :(得分:-1)

对于使用URI查询参数的初学者来说,这应该是一个“难闻的气味”。其次,你需要看一下你的客户端和服务器可以讨论的一些mime类型,例如你的信用示例:

如果我对客户/ 21 /学分做GET,我可能会得到这样的文件:

Content-type:application / vnd.creditstore + xml

<credits>
   <user>21</user>
   <credits>10</credits>
   <a href="/customer/21/credits/add" rel="add">Add credits to this account</a>
</credits>

这告诉了解您的词汇的客户,如果他们想要向该用户添加信用,他们需要在该链接上发布内容。这是HATEOAS(上帝,我讨厌这个首字母缩略词,我甚至可能说错了)。

现在这一切都完全脱离了我的头脑,我可能会诅咒那个XML示例,但它应该让你思考正确的方向。