Http 在RESTAPI中处理标志和属性的选项有哪些?

Http 在RESTAPI中处理标志和属性的选项有哪些?,http,api,rest,Http,Api,Rest,假设您在RESTAPI中有一个复杂的资源。此资源上有多个一对多标志和属性(即,用户可能给资源的评级为1到5,或者用户可能“喜欢”该资源,或者将其标记为垃圾邮件,或者忽略它,或者导致设置其他一些状态) 对于在以资源为中心的体系结构中表示这一点的最佳方式,已经提出了一些建议,但到目前为止,没有一个真正让我感到高兴。所以让我们一起来寻找这个来源;您认为哪些变体最容易理解?我们没有想到哪些变体?假设是一个基于OAuth的API,这里的一切都是在当前授权用户的上下文中完成的 布尔标志 备选案文1: G

假设您在RESTAPI中有一个复杂的资源。此资源上有多个一对多标志和属性(即,用户可能给资源的评级为1到5,或者用户可能“喜欢”该资源,或者将其标记为垃圾邮件,或者忽略它,或者导致设置其他一些状态)

对于在以资源为中心的体系结构中表示这一点的最佳方式,已经提出了一些建议,但到目前为止,没有一个真正让我感到高兴。所以让我们一起来寻找这个来源;您认为哪些变体最容易理解?我们没有想到哪些变体?假设是一个基于OAuth的API,这里的一切都是在当前授权用户的上下文中完成的

  • 布尔标志

    • 备选案文1:

      GET /resource/{id}/muted POST /resource/{id}/muted BODY:true POST /resource/{id}/muted BODY:false 获取/resource/{id}/mute POST/resource/{id}/mute-BODY:true POST/resource/{id}/mute正文:false
    • 备选案文2:

      GET /resource/{id}/muted PUT /resource/{id}/muted BODY:true DELETE /resource/{id}/muted GET /resource/{id}/rating PUT /resource/{id}/rating BODY:4 DELETE /resource/{id}/rating 获取/resource/{id}/mute PUT/resource/{id}/muted BODY:true 删除/resource/{id}/mute
    • 备选案文3:

      GET /resource/{id}/attributes POST /resource/{id}/attributes BODY:muted=true POST /resource/{id}/attributes BODY:muted=false GET /resource/{id}/attributes POST /resource/{id}/attributes BODY:rating=4 POST /resource/{id}/attributes BODY:rating= 获取/resource/{id}/attributes POST/resource/{id}/attributes主体:mute=true POST/resource/{id}/attributes主体:mute=false
    • 备选案文4:

      GET /resource/{id}/muted POST /resource/{id}/mute POST /resource/{id}/unmute 获取/resource/{id}/mute POST/resource/{id}/mute POST/resource/{id}/unmute
  • 属性

    • 变式1

      GET /resource/{id}/rating POST /resource/{id}/rating BODY:4 获取/resource/{id}/rating POST/resource/{id}/评级机构:4
    • 备选案文2:

      GET /resource/{id}/muted PUT /resource/{id}/muted BODY:true DELETE /resource/{id}/muted GET /resource/{id}/rating PUT /resource/{id}/rating BODY:4 DELETE /resource/{id}/rating 获取/resource/{id}/rating PUT/resource/{id}/评级机构:4 删除/resource/{id}/rating
    • 备选案文3:

      GET /resource/{id}/attributes POST /resource/{id}/attributes BODY:muted=true POST /resource/{id}/attributes BODY:muted=false GET /resource/{id}/attributes POST /resource/{id}/attributes BODY:rating=4 POST /resource/{id}/attributes BODY:rating= 获取/resource/{id}/attributes POST/resource/{id}/attributes BODY:rating=4 POST/resource/{id}/attributes主体:评级=

想法?建议?其他API是如何处理这个问题的?你是怎么处理的?您是否发现类似这样的设计问题对开发人员的满意度或API的易用性产生了重大影响?

如果我能同时提供一系列,我喜欢变体3——否则,我对1和3不感兴趣

而且,绝对没有使用DELETE的

来自:

统一的接口会降低效率,因为信息是以标准化的形式传输的,而不是以特定于应用程序需求的形式传输的。REST接口设计用于高效地传输大粒度超媒体数据

因此,您需要一个变体5,它同时适用于标志和其他属性:

GET /resource/{id}/  BODY:{muted: false, like: false, rating: 2, ignored: true}
POST /resource/{id}/ BODY:{muted: true, like: false, rating: 2, ignored: true}
POST /resource/{id}/ BODY:{muted: false, like: false, rating: 2, ignored: true}
一个重要原因是,RESTful HTTP应用程序的大部分效率来自缓存,当其工件具有尽可能大的粒度时,以及当其数据能够以尽可能少的标识符访问时,缓存效果最佳。如果同时在
/resource/{id}/
/resource/{id}/muted
上公开“muted”标志,则存在缓存无效问题。如果只在
/resource/{id}/
中公开它,则不会公开


如果您设计的应用程序旨在通过较小的有效负载提高效率,那么您无法从大粒度缓存中获益,REST体系结构样式不适合您的应用程序。HTTP可能也不是,但我可以理解,在今天的市场上,有人可能会被它卡住。

好吧,这实际上是变体3,但它使用的是
应用程序/json
有效负载,而不是
应用程序/x-www-form-urlencoded
有效负载。同样的基本思想,但是
application/x-www-form-urlencoded
更适合于资源的部分更新。此外,由于所有内容都在OAuth之后,缓存参数比通常的要弱一些。接收端的客户端可以缓存,当然,如果资源更大,缓存会更高效。但是,从开发人员的角度来看,95%以上的数据一次只会变异一个属性,如果您立即执行
GET
,则无法假设发送到服务器的数据体与您接收到的数据体匹配。这可能会将
PUT
作为一个选项删除,并扩展为
DELETE
。我对此很满意,因为这是我最不喜欢的解决方案。至于缓存失效,可以很安全地说,有问题的应用程序只能最小化这个问题,而不能消除它。这就是大规模的生活。好吧,如果你不打算使用统一接口、缓存或无状态(我假设你也忽略了超媒体),那么我会说你想要设计的任何API都不是REST API。听起来RPC会是一个更好的选择。最后两篇文章不应该是PUTs吗?是的,我应该更清楚地说明变量3是
application/x-www-form-urlencoded