代码之家  ›  专栏  ›  技术社区  ›  Jason Christa

HTTP谓词和内容协商或获取REST服务的字符串?

  •  2
  • Jason Christa  · 技术社区  · 15 年前

    我正在设计一个REST服务,并试图权衡使用完整的http谓词数组和内容协商与GET字符串变量的利弊。我的选择会影响可缓存性吗?这两种解决方案可能都不适用于每个领域。

    哪一种最适合挑选api版本(例如?版本=1.0)?

    哪一种最适合返回数据类型(例如?type=json)?

    1 回复  |  直到 15 年前
        1
  •  5
  •   Richard Levasseur    15 年前

    CRUD/查询最好用HTTP谓词表示。创建和更新通常是PUT或POST。检索就是获取。删除就是删除。这就是通常的映射。主要的一点是GET不会引起副作用,而且动词做了你期望它们做的事情。

    不过,我们强烈建议 通过URL传递动词。

    对API进行版本设置的“最佳”方法是在每个请求的基础上使用HTTP头;这允许客户端升级/降级特定请求,而不是每个请求。当然,这种版本控制的粒度需要在一开始就考虑进去,这可能会使服务器端代码严重复杂化。大多数人只是使用URL访问服务器。一个较长的解释是 blog post by Peter Williams, "Versioning Rest Web Services"

    没有最佳返回数据类型;这取决于你的应用程序。JSON对于Ajax网站可能更容易,而XML对于想要用Xpath查询的复杂结构可能更容易。协议缓冲区是第三种选择。它还讨论了在URL或HTTP头中指定返回协议是否更好。

    在大多数情况下,头对缓存的影响最大,因为代理在被告知时应该尊重它们,用户代理也是如此(不过,显然UA的行为不同)。仅基于URL的缓存非常依赖于层。一些用户代理不缓存任何带有查询字符串的内容(Safari、iirc),代理可以根据自己的需要自由缓存或不缓存。