在REST中,为每个资源表示创建一个单一的内容类型,还是有单独的内容类型?

在REST中,为每个资源表示创建一个单一的内容类型,还是有单独的内容类型?,rest,Rest,如果我想遵循为REST API使用自定义内容类型的做法,我是应该为整个项目定义单个自定义内容类型,还是为项目中使用的每个资源表示(从REST API发送/返回的内容)定义自定义内容类型 也就是说,如果我正在构建一个“Bookstore”REST API,其中服务位于名称空间com.mycompany.mybookstoreapp中,我是否创建一个单一的内容类型: Content-Type: application/com.mycompany.mybookstoreapp+xml applica

如果我想遵循为REST API使用自定义内容类型的做法,我是应该为整个项目定义单个自定义内容类型,还是为项目中使用的每个资源表示(从REST API发送/返回的内容)定义自定义内容类型

也就是说,如果我正在构建一个“Bookstore”REST API,其中服务位于名称空间com.mycompany.mybookstoreapp中,我是否创建一个单一的内容类型:

Content-Type: application/com.mycompany.mybookstoreapp+xml
application/vnd.acme.user-v1+xml
application/vnd.acme.user+xml;v=1
或者我是否为每种类型的数据创建一个内容类型,这些数据可以通过我的书店REST API发布/检索

Content-Type: application/com.mycompany.mybookstoreapp.user+xml
Content-Type: application/com.mycompany.mybookstoreapp.order+xml
Content-Type: application/com.mycompany.mybookstoreapp.book+xml

为每个数据描述内容类型似乎是最安全的解决方案。如果出于某些原因,您希望以后成为HATEOAS兼容者,这将更容易。另一方面,对于所有内容都使用一种内容类型没有多大意义。内容类型描述了特定数据的类型

关于版本控制,您可以通过三种不同的方式向API添加版本控制。首先,您可以在URI中添加版本号,这是一种简单的方法:

/api/v1/users
或者,您可以使用新的内容类型:

Content-Type: application/com.mycompany.mybookstoreapp+xml
application/vnd.acme.user-v1+xml
application/vnd.acme.user+xml;v=1
或者,您也可以在Accept标头中使用限定符,这样您就不会接触您的内容类型:

Content-Type: application/com.mycompany.mybookstoreapp+xml
application/vnd.acme.user-v1+xml
application/vnd.acme.user+xml;v=1

这真的取决于你。第一种解决方案很简单,但与其他两种解决方案相比,它不那么宁静。但是这些解决方案需要更多的智能客户端。

根据我的研究,我发现人们正在创建特定的mime类型来表示传递给REST API的数据。就我而言,我们不是在做仇恨。我们正在构建一个企业应用程序,该应用程序在HTTP上有效地执行POX(并称之为“REST”)。我们希望利用定义内容类型版本的功能,以便在不同时间构建企业应用程序的不同部分时进行版本控制。因此,如果项目A和B使用由项目C构建的服务,并且A和B处于不同的发布周期,因此A必须使用版本1.0,B必须使用verison2.0的“book”内容类型调用相同的URI时,我们希望利用使用“Accept”头的功能,例如“Accept:content-type:application/com.mycompany.mybookstoreapp.book-v1+xml”和“Accept:content-type:application/com.mycompany.mybookstoreapp.book-v2+xml”作为GET请求。希望这提供了更多的背景,这将开始收到一些答案。。。人们似乎一直把它当作一个好问题来投票。