文章目录
  1. 1. 如何维持URI的兼容性
  2. 2. 如何维持XML和JSON表述的兼容性
  3. 3. 如何扩展Atom
  4. 4. 如何维护链接的兼容性
  5. 5. 如何实现支持可扩展性的客户端
  6. 6. 何时需要版本化&如何版本化RESTful Web服务

在任何分布式CS环境管理变化都是困难的。在这些环境中,客户端依赖服务器来遵守契约,RESTful web服务也不例外。对于web服务,契约包含URI、资源、表述的结构和内容、格式及对每个资源所用的HTTP方法。任何对服务器的改变在向后兼容之前似乎都是良性的。

当变化是后向兼容的,当修改服务器时无需升级客户端,客户端除了在服务器升级时宕机之外能够继续按照以往的方式使用服务器。当多个客户端和服务器在不同时刻升级,另一个比较重要的兼容性是前向兼容。在某些情况下,一些新客户端可能会和老服务器交互。前向兼容的目的是确保新客户端即使在老服务器功能缺失时能够继续使用老服务器。应用是否需要考虑后向兼容和前向兼容取决于操作环境,维护兼容性的手段是可扩展性。可扩展性是解决未来变化的设计过程。作为传输协议,HTTP是可扩展的,可以添加新方法或标头来扩展HTTP(须谨慎使用),但不意味着HTTP之上的应用也自动地可扩展。尽管维护兼容性是值得的,但并不总是有可能实现。

如何维持URI的兼容性

为了使URI变化跟现有客户端兼容,必须保持URI持久不变。将相同查询参数但排序不同的请求URI视为相同。客户端必须能够对不同查询参数排序获得相同的结果。当对URI添加新参数,继续使用现有参数并将新参数视为可选。当改变查询参数数据格式,继续使用现有格式。如果行不通,通过新的查询参数或新URI引入格式变化。默认情况下,将URI中的查询参数视为可选,除非这些参数基于并发或安全使用。

如何维持XML和JSON表述的兼容性

为了使XML/JSON表述变化跟现有客户端兼容,设计XML/JSON格式保持子节点无序。当对XML/JSON进行改动,保持现有分层结构以使客户端能够继续使用相同结构提取数据。使请求中新创建的数据节点可选以同现有客户端兼容。如果客户端发送新数据字段,服务器也必须能继续处理。不要删除或重命名响应体中表述的任何数据字段。

如何扩展Atom

Atom格式被设计成支持未来的扩展。Atom格式中的所有元素允许外来的XML元素和属性。可以通过下列方式扩展Atom:

  1. 添加链接关系类型,例如”种子分页和打包”扩展(RFC 5005)引入了fist、last、previous和next链接关系类型。
  2. 在诸如atom:entry、atom:feed和atom:link之类的Atom元素内增加新元素。例如”Atom跟帖扩展”(RFC 4685)引入了in-reply-to和total元素。
  3. 在atom:content元素内嵌套外来的XML或其他文本内容。

对atom:feed和atom:entry元素添加子元素或属性进行扩展,只要这些扩展不破坏客户端自身的功能且其他软件不了解这些扩展。当在atom:content元素下添加外来内容,在atom:summary元素下添加可读文本或XHTML。

如何维护链接的兼容性

为了使链接变化跟现有客户端兼容,避免删除链接,不要改变链接的rel和href属性值。当引入新资源,使用链接向客户端提供资源的URI。

如何实现支持可扩展性的客户端

当服务器作出兼容性改变,为了使客户端不操作失败,可让客户端解析表述体,仅寻找已知数据。不要假设从服务器接收到的表述是固定媒体类型、字符编码、内容语言或内容编码。

何时需要版本化&如何版本化RESTful Web服务

当服务器无法维持兼容性时或某些客户端需要与其他客户端不同的行为或功能时考虑对某些或所有资源版本化以对客户端隔离改变。当对RESTful web服务版本化时,当资源行为或表述所含信息发生变化时使用新URI添加新资源,在子域名、路径片段或查询参数中使用例如v1或v2这样易于检测的模式分辨URI。避免对同一资源使用不同媒体类型的新表述视为一个版本。

文章目录
  1. 1. 如何维持URI的兼容性
  2. 2. 如何维持XML和JSON表述的兼容性
  3. 3. 如何扩展Atom
  4. 4. 如何维护链接的兼容性
  5. 5. 如何实现支持可扩展性的客户端
  6. 6. 何时需要版本化&如何版本化RESTful Web服务