我们有像pluralsight这样的网站,作者和客户注册。作者发表他们的课程,客户可以给这些课程评分。表结构如下:
作者表:(保存作者的基本信息:一对一)
authorId |名字|联系|电子邮件|评级
1 | sahil | 9971343992 | shaf@gmail.com | 3.2
authorRating:(保存给予客户作者的评分:一对多)
Id | authorId | customerId |评分|
1 | 1 | 101 | 2.7
2 | 1 | 201 | 3.7
当authorRating表中插入/更新/删除某些记录时,作者表中的评级会更新。有一些复杂的算法可以根据authorRating表记录最终确定作者表中的评级。
我们为此创建了以下API:
PUT api / author / 1 / rating /:如果authorRating表中有任何更改,我们会重新计算该作者的评级并触发此API以通过新评级。这接受评级并在作者表中添加/更新。如果作者表没有id = 1,则会返回验证错误
DELETE api / author / 1 / rating /:这将删除作者id = 1的评级,即将其设置为NULL。如果作者表没有id = 1,则会返回验证错误。
这是正确的API设计吗?或者我们应该只暴露PUT API,如果他们在PUT API中将评级发送为null,我们会在作者表中将其设置为null吗?
或者我们应该考虑在这里使用PATCH吗?
答案 0 :(得分:3)
至于你只修改一个结构的字段,我认为PATCH在这里更合适,但它应该发送到父资源:
PATCH api/author/1
答案 1 :(得分:1)
对于这些评级操作,我会使用类似的东西:
POST /api/author/1/rating
PATCH /api/author/1/rating
。您可能希望authorRating
表中有更多数据不想更改(例如作者和客户ID),但您只是更新了某些字段,在这种情况下,是评分。DELETE /api/author/1/rating
,正如您所解释的那样,是有道理的。答案 2 :(得分:0)
对RESTful API使用POST方法是一种常见做法。您可以发布几乎任何消息并通过参数处理消息。您可以根据需要发布删除,更新或其他命令。
答案 3 :(得分:0)
HTTP是一种协议,它定义了允许操作资源的方法;互联网上的文件或数据就这么说。在调用这些资源时,由其中一个操作触发的任何业务逻辑或多或少只是副作用。虽然某些事情可以通过多种方式实现,但操作(略微)在它们传达的语义上有所不同。
RFC 7231中指定的 PUT
将当前表示替换为请求中提供的表示,确实声明了以下有关部分更新的内容:
部分内容更新可以通过定位单独标识的资源,其状态与较大资源的一部分重叠,或者使用已明确定义的其他方法用于部分更新(例如,RFC5789中定义的PATCH方法)。
所以,您可以选择"重叠"资源并更新其他资源,这也会改变重叠数据,从而改变实际资源中的数据,或者因此使用PATCH
。
引物可以很容易地被认为是其他资源的某些信息嵌入在实际资源中,并且在更新其他资源时,实际资源的状态也将因此而改变。想想用户和他的地址,即
根据罗伊菲尔丁的说法,他在论文中写了以下内容
REST中信息的关键抽象是一种资源。 任何可以命名的信息都可以是资源:文档或图像,时间服务(例如"今天洛杉矶的天气"),其他的集合资源,非虚拟对象(例如人)等。换句话说,任何可能是作者超文本引用的目标的概念必须符合资源的定义。 资源是对一组实体的概念映射,而不是与任何特定时间点的映射相对应的实体。“
资源应该通过自己的唯一标识符进行命名和引用。实体到资源的直接映射通常是不可取的,因为资源可以并且可能应该包含更多信息以供客户采取进一步的行动。
因此,如果您认为评级是一个好的实体和/或一个好的资源,那么由您决定。尽管如此,我并不是一个忠实的粉丝,但这是一个固执己见的立场。
DELETE
有一些特殊的语义。它实际上并不保证删除文件,但它会通过删除该特定资源的关联(URI)来使资源不可用。删除的资源会发生什么,实际上取决于实现。
DELETE方法请求源服务器删除目标资源与其当前功能之间的关联。实际上,此方法类似于UNIX中的rm命令:它表示对源服务器的URI映射执行删除操作,而不是期望删除先前关联的信息。
...
如果目标资源具有一个或多个当前表示,它们可能会或可能不会被源服务器销毁,并且相关存储可能会或可能不会被回收,完全取决于资源的性质及其实现方式。原始服务器(超出了本规范的范围)。 ...一般来说,假设原始服务器只允许对具有规定机制的资源进行DELETE以完成删除。
通常DELETE
只能用于之前通过PUT
或POST
创建的资源,而之前的创建是通过自己的Location
响应标头确认的。
话虽如此,当你想知道这是否是正确的API设计时。实际上,没有对错,你采取的立场主要是自以为是的立场。只要您遵守HTTP协议规范(在您的特定情况下),您就不会违反REST架构师原则。如果您以一种使其唯一可识别的方式设计您的评级资源,您可以使用delete来取消作者的相应评级(并可能从您的数据库中删除数据)或发送包含该评级资源的新内容的put请求各自的终点。
请记住,服务器应该尽最大努力教会客户端可以采取的下一步操作,而无需让客户端获得有关您的API的带外信息,否则您将把客户端连接到您的API因此在将来更改API时可能会出现问题。