14

RESTful インターフェイスの設計に関するこの優れたプレゼンテーションによると、バージョン管理を実装するための推奨される方法は、次のようなものを使用して 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
  }
]
4

2 に答える 2

16

コンテンツ タイプにバージョンを追加することで、バージョニングを実装できます。

application/vnd.acme.user-v1+xml

または、ヘッダーで修飾子を使用してAccept、コンテンツ タイプに触れないようにすることもできます。

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

application/vnd.acme.user+xmlコンテンツ タイプを 2 つの部分に分割できます。最初の部分 ( application/vnd.acme.user) はメディア タイプを記述し、2 番目の部分 ( xml) は応答の形式を記述します。つまり、 : のような別の形式を使用できjsonますapplication/vnd.acme.user+json

HATEOASの世界では、XML は読みやすさとセマンティックの目的で JSON よりも優れています。

于 2012-08-20T12:24:22.417 に答える
5

私が知っている最もクリーンな方法は、プロファイルを使用することです。そのための IETF RFC があります ( RFC 6381 )。

accept ヘッダーを使用して、期待する応答のタイプを示します。修飾子も引き続き使用できます。1 つ以上のコンマ区切りのプロファイルでコンプライアンスを要求できますが、複数のプロファイルを指定する場合は引用符を使用する必要があります。

受け入れる:アプリケーション/json; profile="http://profiles.acme.com/user/v/1"

content-type ヘッダーを使用すると、サーバーは同様に応答できます。

コンテンツ タイプ:アプリケーション/json; profile="http://profiles.acme.com/user/v/1"

于 2013-03-10T13:51:53.490 に答える