2011-03-08 48 views
2

鉴于我们提供一种RESTful API,提供书籍的实体在在REST的GET查询中添加附加信息的好方法是什么?

/books 

听力和客户端可以在通常

GET /books/{id} 

得到一本书假设我们要开始对书籍提供折扣只有我们最警惕的买家。这些买家将获得折扣码,该码将降低该书的价格。

因此,通用的反应可能是

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

哪里有优惠码查询的响应可能是

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

我们能想出的后端处理,但客户通过restful api提交折扣码的最佳做法是什么?

某些书籍将有资格享受折扣,而其他书籍不会。折扣不会很广(全部20%),而是会映射到特定代码(或客户端/代码组合)的特定价格。

我们认为:

  • kludging网址

    GET /码/ {} someCode /书籍/ {ID}

  • 添加代码的标头值

  • 使用查询字符串

    GET/books?cod e = myCode

  • 什么?

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

回答

2

我喜欢使用查询变量。我只是看着REST Web服务书,我在这方面的主要参考依据,他们说:

使用查询变量只建议 参数被插入到 算法......如果两个不同的URI在它们的查询变量中只有 ,这意味着它们是 它们是不同的输入集合 进入相同的底层算法。

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

Charles

+0

“仅使用查询变量来建议插入算法的参数......”这当然就是这种情况。谢谢。 – gmoore 2011-03-08 23:52:34

1

如果你要提交的东西不是幂等的,我会建议使用POST而不是GET。你不希望客户能够多次使用他们的代码。

+0

实际上代码到期并不是问题在这里。我会更新这个问题来反映这一点。无论如何,你对幂等性的评论仍然相关。 – gmoore 2011-03-08 23:26:58

1

您在URL或标题值中添加的任何内容都会被截取,并可能允许其他用户“伪造”其折扣ID。 1方法是引入新的POST调用,这将允许使用简单的HTTPS对ID进行加密。发布的数据可能与discountID或customerID一样简单。

添加 - 对不起迈克尔,你已经说:)

+0

使用POST执行获取书籍列表的操作感觉不对。虽然,保持代码安全的好处在于。 – gmoore 2011-03-08 23:35:57

0

因此当用户检索书自动返回本书以适当的折扣,例如你可以注册一个表中的代码:

用户可以添加一些代码

POST /register/{code} 

这将条目添加到表{}用户 - 通过

GET /books/{id} 
{}代码所以当用户检索

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

相关问题