Web services RESTfulWebAPI中有多少自定义MIME类型?

Web services RESTfulWebAPI中有多少自定义MIME类型?,web-services,http,rest,mime-types,Web Services,Http,Rest,Mime Types,RESTful web API应该为每个主要资源类(例如客户、预订、酒店房间等)使用特定于供应商的自定义MIME类型,还是应该在所有资源中共享特定于供应商的MIME类型 一方面,每个资源都是不同的,因为它有不同的字段,例如,可能接受新客户的端点不能接受新订单 然而,这表明这是一件坏事(tm),因为这可能会使客户端的解析过于复杂,但除此之外没有给出太多细节。我可以肯定地认为这是一个合理的担忧。按照每种资源类型的方法,您甚至可能会继续为每种类型的集合创建一个自定义类型,包括嵌入的非匿名实体。扩展@d

RESTful web API应该为每个主要资源类(例如客户、预订、酒店房间等)使用特定于供应商的自定义MIME类型,还是应该在所有资源中共享特定于供应商的MIME类型

一方面,每个资源都是不同的,因为它有不同的字段,例如,可能接受新客户的端点不能接受新订单


然而,这表明这是一件坏事(tm),因为这可能会使客户端的解析过于复杂,但除此之外没有给出太多细节。我可以肯定地认为这是一个合理的担忧。按照每种资源类型的方法,您甚至可能会继续为每种类型的集合创建一个自定义类型,包括嵌入的非匿名实体。

扩展@deceze留下的注释:您不需要它。您是否可能混淆了“特定于供应商的自定义MIME类型”还有别的吗

我不明白为什么您不能限制自己发送所有资源的
application/json
application/xml
(或两者,取决于请求)

当然,每个资源的结构完全取决于其各自的字段,但您仍然可以将它们作为JSON哈希(如果您选择JSON)提供

RESTfulWebAPI是否应该使用特定于供应商的自定义MIME类型 对于每个主要资源类别(例如客户、预订、, 或者API是否应该共享一个特定于供应商的MIME 在所有资源中键入

这并不重要,因为它并没有真正将客户机与服务器解耦,它只是一个粗粒度的解决方案

然而,最坏的实践表明,这是一件坏事(tm) 这可能会使客户端的解析变得过于复杂,但不会给 除此之外还有很多细节


是的,这是真的。您应该使用细粒度的解决方案,例如带有标准vocab的RDF,比如开放链接数据,其余部分可能使用hydra。MIME类型定义为“Internet媒体类型是一个由两部分组成的标识符,用于在Internet上标准化文件格式”。这意味着,如果数据的格式正在更改,(TXT->HTML->JSON->XML->YAML->CSV->…),MIME类型需要更改

也就是说,还有其他完全有效的用途,上面约书亚·贝尔登特别提到了一个。下面是一个确定API版本的示例

当前版本

默认情况下,所有请求都会收到v3版本的API。我们 鼓励您通过Accept明确请求此版本 标题

接受:application/vnd.github.v3+json

发送到API的v3版本的v2请求的数据布局是不兼容的,即使它们位于同一URL(反之亦然),这是有道理的。它还有助于减少从一个API版本移动到下一个API版本所需的更改(例如,您不必更新URL)

也就是说,这并不意味着您的应用程序在默认情况下应该使用自定义MIME类型,以便为特定于版本的API提供“未来证明”。如果您的应用程序没有具有许多公共使用者的大型面向外部的API,那么您可能不需要自定义版本的MIME类型

此外,RESTAPI端点应该确定生成和使用的数据的结构,而不是MIME类型。例如,GET“/customers/5”应该只生成从客户实体序列化的数据。和后“/预订” 应仅使用将正确反序列化到保留实体的数据。这意味着您的端点的序列化将处理语法检查,并应返回400级代码,并解释所提供的数据结构不正确

GitHub API中突出显示此行为的另一个示例

 HTTP/1.1 422 Unprocessable Entity
 Content-Length: 149

 {
   "message": "Validation Failed",
   "errors": [
     {
       "resource": "Issue",
       "field": "title",
       "code": "missing_field"
     }
   ]
 }
总之,大多数序列化框架都是“开箱即用”的,希望处理“application/json”和“application/xml”。虽然您当然可以添加自定义的特定于供应商的MIME类型,但如果您没有充分的理由这么做,为什么要这样做呢


抱歉,如果我只是用这个回答创建了一个僵尸问题。

使用MIME类型可以将REST资源与其表示(即json、xml、pdf等)分开。这会减少耦合,但ideia不会使用它来定义资源的模式,而是定义其格式

一方面,每个资源都是不同的,因为它有不同的字段,例如,可能接受新客户的端点不能接受新订单

如果我不理解的话,这可以通过正确识别资源来实现


直接回答您的问题:尽量减少自定义MIME类型的数量。我想您可以使用它们来声明API的不同版本,因为这里已经提到了。

我首先想听听自定义MIME类型的例子。这似乎是一个寻找真正问题的学术想法。用于对rest服务进行版本控制。