版本控制一个RESTful API与XML和JSON内容类型(Versioning a RESTfu

2019-06-27 04:52发布

根据这个优秀的演讲在设计REST风格的接口,实现版本的首选方法是利用接受头,使用是这样的:

GET /products HTTP/1.1
Host: example.com
Accept: application/vnd.com.myservice.v2+xml

这完全适用于XML的内容类型,但可以使用相同的方案进行版本的JSON-相同呢?

即,是否有可能要求:

GET /products HTTP/1.1
Host: example.com
Accept: application/vnd.com.myservice.v2+json

他们的回应是这样的:

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>

和JSON当量(排序的):

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

[
  {
    id: "1234",
    links: [
      {
        rel: "self",
        href: "http://example.com/products/1234"
      }
    ],
    name: "Red Stapler",
    price: {
      currency: "EUR",
      value: 3.14
    },
    availability: false
  }
]

Answer 1:

您可以通过添加内容类型版本实现版本:

application/vnd.acme.user-v1+xml

或者,你也可以使用一个限定在Accept头,这样你不碰你的内容类型:

application/vnd.acme.user+xml;v=1

您可以拆分图书内容类型application/vnd.acme.user+xml分为两个部分:第一个( application/vnd.acme.user )描述的媒体类型,而第二个( xml )的响应的格式。 这意味着你可以像使用其它格式jsonapplication/vnd.acme.user+json

在HATEOAS世界,XML比JSON的可读性和语义目的好,如果你想使用JSON,你可能会感兴趣的本规范: https://github.com/kevinswiber/siren 。



Answer 2:

我所知道的最彻底的方法是使用配置文件。 目前对于(一个IETF RFC RFC 6381 )。

使用accept头,说明你期待什么类型的响应。 你仍然可以使用限定词为好。 您可以与一个或多个以逗号分隔的配置文件要求达标,但如果指定了多个配置文件,您必须使用引号。

接受:应用/ JSON的; 型材= “http://profiles.acme.com/user/v/1”

使用Content-Type头,服务器可以响应的一致好评:

内容类型:应用/ JSON; 型材= “http://profiles.acme.com/user/v/1”



文章来源: Versioning a RESTful API with both XML and JSON Content-Type