http://kenai.com/projects/suncloudapis/pages/Home的Sun Cloud API是RESTful API遵循的一个很好的示例。诚如RESTful原则,当您获取资源时,您只能获得该资源的表示形式。RESTful API的Mimetypes
响应中的Content-Type标头准确告诉您该资源的类型,例如application/vnd.com.sun.cloud.Snapshot + json。 Sun已经向IANA注册了这些mimetypes。
目前这种情况通常如何实用?我见过的大多数API都使用了“application/json”的Content-Type。这告诉你,响应是JSON,但没有更多关于它。你必须在JSON对象中有一些东西,比如“type”属性,才能知道它是什么。我正在设计一个RESTful API(它不会公开,因此我不会注册mimetypes)。我一直在使用RESTEasy,我发现即使我指定了一个完整的mimetype,响应头中的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 Unauthorized”响应,并建立一个登录对话框,即使你想自己处理。
我对Web客户端的一个问题是浏览器拦截HTTP状态代码和标头。例如,如果您返回401 Unauthorized,那么JavaScript客户端在浏览器抓取它并建立自己的登录对话框之前不会看到它。从此,浏览器在每个请求上都放置自己的授权标头。 Mimetypes通过OK,但至少有一个状态码(401)是一个问题。 – 2009-11-23 14:10:34