2012-11-08 60 views
8

我设计一个RESTful API和企图是描述性的,使文档更清晰我要声明我的内容类型HTTP头如下:是使用自定义JSON内容类型是个好主意

Content-Type: application/vnd.mycorp.mydatatype+json 

其中mycorp是我公司唯一的标识符,mydatatype对每种数据类型都是唯一的。一个例子是:

Content-Type: application/vnd.ford.car+json 

{ 
"manufactured_year": 2000 
, "color": "blue" 
, "hp": 160 
, "model" "Focus" 
, "type": "sedan" 
} 

这个内容类型将是必需的,以使POST有效并且将作为响应的一部分发送。在我看来,这是一种很好的方式来定义有效负载内应该有的规则。

我似乎无法找到一个好的资源,看这是一个好主意,还是IETF标准允许的。

所以,问题是:哪个更可行,application/vnd.mycorp.mydatatype + json还是应用程序/ json?

回答

4

这是允许的,绝对。这是否是一个好主意是另一回事。

我的经验法则是,它是一种主要的数据格式,它在很多事情中都很有用,需要自行识别,并且您需要在许多应用程序之间进行互操作,绝对可以为它提供媒体类型。

但是,如果它只是一个你的API中还有许多消息,这只是一个资源(或一个资源“类型”)不错,只是使用的应用程序/ JSON。

YMMV,当然。

+0

这是一个好的观点。大问题当然是什么是“主要数据类型”,什么不是。我有一个由我的文档定义好的数据类型......但是RPC API始终是这种情况,我很少发现使用这种方法的人表示它们的数据类型。我想知道是不是这是因为这不是一个好方法,或者API实现者通常不会考虑这个问题。 – gardarh

5

问题是密切相关的REST API 版本

内容类型用于定义内容的类型。 如果使用标准内容类型一样

application/json 

你说给客户端,该消息是JSON格式。这对于所有不使用API​​版本或仅支持最新版本的Web应用程序来说已经足够了。 如果您打算让客户使用您的API的不同版本,标准内容类型是不够的。 考虑以下情形:

把你的例子作为消息

Content-Type: application/vnd.ford.carV1+json 

{ 
"manufactured_year": 2000 
, "color": "blue" 
, "hp": 160 
, "model" "Focus" 
, "type": "sedan" 
} 

1版本在某些时候,你决定表示使用十六进制代码的颜色。因此,您创建类型

Content-Type: application/vnd.ford.carV2+json 

{ 
"manufactured_year": 2000 
, "color": "0000FF" 
, "hp": 160 
, "model" "Focus" 
, "type": "sedan" 
} 

版本2当客户端请求车指定了正确的内容类型,其中包括版本。这告诉应用程序是否将颜色作为十六进制代码或名称发送。

这里你版本资源的表示。支持资源表示版本的替代方法是将版本添加为自定义标题(同时保留内容类型标准)

Content-Type: application/json 
Message-Version: 1.0 
相关问题