根据设计RESTful接口的this excellent presentation,实现版本控制的首选方法是使用Accept-header,使用类似的东西:
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
}
]
答案 0 :(得分:16)
您可以通过添加内容类型:
中的版本来实施版本控制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,您可能会对此规范感兴趣:https://github.com/kevinswiber/siren。
答案 1 :(得分:5)
我所知道的最简洁的方法是使用配置文件。有一个IETF RFC(RFC 6381)。
使用accept标头,指出您期望的响应类型。您仍然可以使用限定符。您可以请求遵守一个或多个以逗号分隔的配置文件,但如果指定了多个配置文件,则必须使用引号。
接受: application / json;型材= “http://profiles.acme.com/user/v/1”
使用内容类型标头,服务器可以做出相同的响应:
内容类型: application / json;型材= “http://profiles.acme.com/user/v/1”