Sun Cloud API在 http://kenai.com/projects/suncloudapis/pages/Home 上是遵循RESTful API的一个很好的例子。符合RESTful原则,当您获取资源时,您只会得到该资源的表示,不多也不少。
响应中的Content-Type头告诉您该资源的类型,例如application/vnd.com.sun.cloud.Snapshot+json。Sun已经向IANA注册了这些MIME类型。
总体上来说,这种方法目前有多实用?我看过的大多数API都使用“application/json”的Content-Type。这告诉您响应是JSON格式,但没有更多信息。您必须在JSON对象中添加“type”属性才能知道它是什么。
我正在设计RESTful API(不会公开发布,因此我不会注册MIME类型)。我一直在使用RESTEasy,并发现即使我指定了完整的MIME类型,响应头中的Content-Type也会与Accept请求头完全相同。如果请求默认要求“application/*+json”,则响应头将具有“application/*+json”。我可能可以在响应发送之前更改标头来解决此问题,但我应该尝试这样做吗?还是响应应该像请求一样具有通配符?
还是像大多数API一样提供“application/json”?
后续补充的想法:
另一种表述问题的方式是:我应该使用HTTP作为协议,还是仅使用HTTP作为传输机制来包装自己的协议?
要使用HTTP作为协议,响应的实体正文包含所请求对象的表示(或错误消息对象的表示),“Content-Type”标头包含对象的确切类型,“状态”标头包含成功或错误代码。
要将HTTP仅用作传输机制,则“状态”标头始终设置为200 OK,“Content-Type”为一些通用内容,例如“application/json”,实体正文包含某些自身具有对象、对象类型、错误代码和其他任何内容。如果您自己的协议是RESTful的,则整个方案都是RESTful的。(HTTP是RESTful协议,但不是唯一可能的协议。)
您自己的协议对所有传输层都是不透明的。如果您将HTTP用作协议,则所有传输层都将理解它并可能执行您不想要的操作;例如,浏览器将拦截“401未经授权”的响应并显示登录对话框,即使您想自己处理它也是如此。
响应中的Content-Type头告诉您该资源的类型,例如application/vnd.com.sun.cloud.Snapshot+json。Sun已经向IANA注册了这些MIME类型。
总体上来说,这种方法目前有多实用?我看过的大多数API都使用“application/json”的Content-Type。这告诉您响应是JSON格式,但没有更多信息。您必须在JSON对象中添加“type”属性才能知道它是什么。
我正在设计RESTful API(不会公开发布,因此我不会注册MIME类型)。我一直在使用RESTEasy,并发现即使我指定了完整的MIME类型,响应头中的Content-Type也会与Accept请求头完全相同。如果请求默认要求“application/*+json”,则响应头将具有“application/*+json”。我可能可以在响应发送之前更改标头来解决此问题,但我应该尝试这样做吗?还是响应应该像请求一样具有通配符?
还是像大多数API一样提供“application/json”?
后续补充的想法:
另一种表述问题的方式是:我应该使用HTTP作为协议,还是仅使用HTTP作为传输机制来包装自己的协议?
要使用HTTP作为协议,响应的实体正文包含所请求对象的表示(或错误消息对象的表示),“Content-Type”标头包含对象的确切类型,“状态”标头包含成功或错误代码。
要将HTTP仅用作传输机制,则“状态”标头始终设置为200 OK,“Content-Type”为一些通用内容,例如“application/json”,实体正文包含某些自身具有对象、对象类型、错误代码和其他任何内容。如果您自己的协议是RESTful的,则整个方案都是RESTful的。(HTTP是RESTful协议,但不是唯一可能的协议。)
您自己的协议对所有传输层都是不透明的。如果您将HTTP用作协议,则所有传输层都将理解它并可能执行您不想要的操作;例如,浏览器将拦截“401未经授权”的响应并显示登录对话框,即使您想自己处理它也是如此。