使用XML和JSON内容类型对RESTful API进行版本控制

使用XML和JSON内容类型对RESTful API进行版本控制,json,rest,content-type,http-1.1,hateoas,Json,Rest,Content Type,Http 1.1,Hateoas,根据《关于设计RESTful接口的讨论》,实现版本控制的首选方法是利用Accept头,使用如下内容: GET /products HTTP/1.1 Host: example.com Accept: application/vnd.com.myservice.v2+xml HTTP/1.1 200 OK Content-Type: application/vnd.com.myservice.v2+xml; charset=UTF-8 Allow: GET, POST <?xml ver

根据《关于设计RESTful接口的讨论》,实现版本控制的首选方法是利用Accept头,使用如下内容:

GET /products HTTP/1.1
Host: example.com
Accept: application/vnd.com.myservice.v2+xml
HTTP/1.1 200 OK
Content-Type: application/vnd.com.myservice.v2+xml; charset=UTF-8
Allow: GET, POST

<?xml version="1.0" encoding="utf-8"?>
<products xmlns="urn:com.example.products" 
          xmlns:xl="http://www.w3.org/1999/xlink">
  <product id="1234" xl:type="simple" 
           xl:href="http://example.com/products/1234">
    <name>Red Stapler</name>
    <price currency="EUR">3.14</price>
    <availability>false</availability>
  </product>
</products>
这非常适用于XML内容类型,但是可以使用相同的方案对JSON等价物进行版本控制

即,是否可以要求:

GET /products HTTP/1.1
Host: example.com
Accept: application/vnd.com.myservice.v2+json
答案可能是这样的:

GET /products HTTP/1.1
Host: example.com
Accept: application/vnd.com.myservice.v2+xml
HTTP/1.1 200 OK
Content-Type: application/vnd.com.myservice.v2+xml; charset=UTF-8
Allow: GET, POST

<?xml version="1.0" encoding="utf-8"?>
<products xmlns="urn:com.example.products" 
          xmlns:xl="http://www.w3.org/1999/xlink">
  <product id="1234" xl:type="simple" 
           xl:href="http://example.com/products/1234">
    <name>Red Stapler</name>
    <price currency="EUR">3.14</price>
    <availability>false</availability>
  </product>
</products>

您可以通过在内容类型中添加版本来实现版本控制:

application/vnd.acme.user-v1+xml
或者,您也可以在
Accept
标题中使用限定符,这样您就不会触碰您的内容类型:

application/vnd.acme.user+xml;v=1
您可以将内容类型
application/vnd.acme.user+xml
分为两部分:第一部分(
application/vnd.acme.user
)描述媒体类型,第二部分(
xml
)描述响应格式。这意味着您可以使用另一种格式,如
json
application/vnd.acme.user+json


在HATEOAS的世界里,XML在可读性和语义方面优于JSON,如果您想使用JSON,您可能会对以下规范感兴趣:。

我所知道的最干净的方法是使用概要文件。这方面有一个IETF RFC()

使用accept标头,指出您期望的响应类型。您仍然可以使用限定符。您可以请求遵守一个或多个逗号分隔的配置文件,但如果指定了多个配置文件,则必须使用引号

接受:应用程序/json;配置文件=”http://profiles.acme.com/user/v/1"

使用content type标头,服务器可以做出类似的响应:


内容类型:应用程序/json;配置文件=”http://profiles.acme.com/user/v/1“

+1获取指向该演示文稿的链接(如果没有其他内容)。谢谢,谢谢。在决定限定符和新媒体类型时,您会选择哪一种进行版本控制?为什么?我会使用限定符来避免修改内容类型。我想这只是口味的问题。