通过REST在GET查询中添加其他信息的好策略是什么?

时间:2011-03-08 23:18:05

标签: rest

鉴于我们提供了一个宁静的api,为书中实体提供服务

/books

客户可以按常规获得一本书

GET /books/{id}

假设我们想开始向我们最警惕的买家提供书籍折扣。这些买家将获得折扣代码,该代码将降低该书的价格。

因此,通用响应可能是

 GET /books/4
 {"id":4, "price":"24.95"}

对具有折扣代码的查询的回复可能是

 GET /books/4
 {"id":4, "price":"24.95", "yourPrice":"19.95"}

后端处理我们可以搞清楚,但客户提交折扣代码而不是一个宁静的api的最佳做法是什么?

某些书籍有资格享受折扣,而有些书籍则没有。折扣不会广泛(所有商品减免20%),而是会映射到特定代码(或客户/代码组合)的特定价格。

我们考虑过:

  • kludging url

    GET / codes / {someCode} / books / {id}

  • 在标题值中添加代码

  • 使用查询字符串

    GET / books?code = myCode

  • 其他什么?

编辑:我们的目标不是实现一次性代码。相反,对于某些固定的帐套,这些折扣代码可以使用一定的固定次数。

4 个答案:

答案 0 :(得分:2)

我喜欢使用查询变量。我刚看了 RESTful Web Services 这本书,这是我在这方面的主要参考,他们说:

  

仅使用查询变量进行建议   插入的参数   algorithm ...如果两个URI只有不同   在它们的查询变量中,它意味着   他们是不同的投入   进入相同的基础算法。

在我看来,您的折扣代码是折扣算法的输入。

查尔斯

答案 1 :(得分:1)

如果你要提交任何不是幂等的东西,我会建议使用POST而不是GET。您不希望客户端多次使用其代码。

答案 2 :(得分:1)

您在网址或标头值中添加的任何内容都会被截取,并可能允许其他用户“伪造”其折扣ID。 1方法是引入新的POST调用,允许使用简单的HTTPS加密ID。 POSTed数据可以像discountID或customerID一样简单。

添加 - 抱歉迈克尔,你已经说过了:)

答案 3 :(得分:0)

您可以在表格中注册代码,这样当用户检索到该图书时,会自动以适当的折扣返回该图书,例如:

用户可以添加一些代码

POST /register/{code}

这将在表{user} - {code}中添加一个条目,以便用户通过

进行检索
GET /books/{id}

将使用该条目来应用折扣。我猜你在{code} - {book}之间已经有了一些关系,所以不会进入。