RESTful Web API中有多少个自定义MIME类型?

时间:2012-03-20 22:14:48

标签: web-services http rest mime-types

RESTful Web API是否应为每个主要资源类(例如Customer,Reservation,HotelRoom等)使用特定于供应商的自定义MIME类型,或者API是否应在所有资源中共享特定于供应商的MIME类型?

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

然而,Rest Worst Practices表明这是一个糟糕的事情(tm),因为这可能会使客户端的解析变得复杂,但除此之外没有提供太多细节。我绝对可以认为这是一个有效的问题。遵循每资源类型的方法,您似乎甚至可以继续为嵌入式非匿名实体的每种集合创建自定义类型。

4 个答案:

答案 0 :(得分:2)

扩展@deceze留下的评论:您不需要它。您是否可能将“特定于供应商的自定义MIME类型”与其他内容混淆?

我不明白为什么你不能限制自己发送application/jsonapplication/xml所有资源(或两者都有,具体取决于请求)。

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

答案 1 :(得分:2)

务实地思考。 MIME类型定义为," Internet媒体类型是一个由两部分组成的标识符,用于标准化Internet上的文件格式。"这意味着,如果数据格式发生变化(TXT-> HTML-> JSON-> XML-> YAML-> CSV-> ...),则需要更改MIME类型。

尽管如此,还有其他完全有效的用途,其中一个是Joshua Belden在上面特别提到的。以下是how GitHub uses MIME type确定API版本的示例。

  

当前版本

     

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

     

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

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

也就是说,它并不意味着您的应用程序默认情况下应使用自定义MIME类型以便将来证明"对于特定于版本的API。如果您的应用程序没有包含许多公共使用者的大型外部API,那么您可能不需要自定义版本的MIME类型。

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

GitHub API的另一个例子突出了这种行为。

 HTTP/1.1 422 Unprocessable Entity
 Content-Length: 149

 {
   "message": "Validation Failed",
   "errors": [
     {
       "resource": "Issue",
       "field": "title",
       "code": "missing_field"
     }
   ]
 }

总而言之,大多数序列化框架都是开箱即用的#34;期待处理" application / json"和" application / xml"。虽然您当然可以添加自定义供应商特定的MIME类型,但如果您没有这么做的话,为什么要这样做呢?

如果我刚用这个回复创建了一个僵尸问题,请道歉。

答案 2 :(得分:0)

  

RESTful Web API是否应使用特定于供应商的自定义MIME类型   对于每个主要的资源类别(例如客户,预订,   HotelRoom等)或API应该共享一个特定于供应商的MIME   输入所有资源?

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

  

然而,Rest Worst Practices表明这是一件坏事(tm)   这可能会使客户端的解析变得复杂,但是并没有给出   除此之外的更多细节

是的,这是真的。您应该使用细粒度的解决方案,例如带有标准词汇的RDF,例如开放链接数据以及可能用于REST部分的hydra。

答案 3 :(得分:0)

使用MIME类型可以将REST资源与其表示(即json,xml,pdf等)分开。这使事情变得更少耦合,但意识形态不是用它来定义资源的模式,而是用它的格式

  

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

如果我非常不受欢迎,可以通过正确识别资源来实现。

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