我试图确定一个REST API的最佳实践来确定客户是否可以访问特定资源。 两个简单的例子场景:
一个电话目录查询服务。 客户端查找通过访问如电话号码。
GET http://host/directoryEntries/numbers/12345
...其中12345
的电话号码,试图找到在目录中。 如果它存在,它会返回又像电话号码,它是人的姓名和地址信息。
一种视频格式换档服务。 客户端提交的视频在一个格式如。
POST http://host/videos/
...并接收“视频GUID”已经由服务器进行视频生成。 客户端然后检查如。
GET http://host/videos/[GUID]/flv
......以获得视频,转换成FLV格式,如果转换后的版本存在。
你会发现,在这两种情况下上述,我没有提到,如果被检查的资源, 不存在会发生什么。 这是我在这里的问题。 我在阅读各种 其他 地方 ,对客户机的正确RESTful方式检查资源是否存在这里是调用HEAD
(或者GET
上的资源),如果资源不存在,它应该期待一个404响应。 这将是很好,所不同的是404响应被广泛认为是一种“错误”; 在HTTP / 1.1规范规定,在4XX类的状态码适用于案件中,客户端“似乎出现了偏差”。 可是等等; 在这些例子中,客户端肯定没有错误。 该公司预计 ,它可以拿回404(或其他人;也许是403,如果它无权访问该资源),并已在请求资源没有错任何责任。 404并非意在表明一个“错误状态”,它仅仅是信息 - “这不存在”。
和浏览器的行为,如HTTP规范建议,因为如果404响应是一个真正的错误。 谷歌浏览器和Firebug的控制台喷涌出一个大大的红“404 Not Found”错误信息到的Javascript控制台404由XHR请求中接收,无论它是由错误处理程序处理或不每一次,并没有方法来禁用它。 这不是用户的一个问题,因为他们看不到控制台,但作为一个开发者,我不想看到一堆的404(或403等)的错误在我的JS控制台时,我完全知道好,他们都没有错误,但信息是由我的Javascript代码来处理。 它的线路噪音。 在我给了第二个例子,它的线路噪声到了极点,因为客户端很可能是轮询服务器/flv
,因为它可能需要一段时间来编译和客户端要显示“未编译尚未”,直到它得到非404。 有可能出现在JS控制台每隔一两秒钟一个404错误。
所以,这是我们与REST来检查资源的存在,最好的或最合适的方法是什么? 我们如何避开在JS控制台线噪声? 它很可能是提议,在我的第二个例子,不同的URI,可以查询到检查编译的状态 ,如:
GET http://host/videos/[GUID]/compileStatus
......然而,这似乎违反了REST原则一点点,给我; 你不使用HTTP来全面和注重的HTTP标头,而是创建自己的协议,让你在身体返回信息告诉你,你想,而不是知道什么,始终返回一个HTTP 200关闭浏览器了。 这是SOAP的一个主要批评 - 它试图“绕开” HTTP而不是用它来充分。 通过这个原理,为什么人会需要返回404个状态码? 你总是可以返回一个200 -当然,200指出该资源的可用的状态信息 ,状态信息,告诉你什么你真的想知道-资源没有被发现。 当然RESTful方式应该是返回404个状态码。
如果我们把它应用到第一的我上面的例子这种机制似乎更加做作; 客户可能会查询:
GET http://host/directoryEntries/numberStatuses/12345
......当然收到200; 数12345
的状态信息存在,并告诉你......该号码未在目录中找到。 这意味着,查询的任何号码是“200 OK”,即使它可能不存在 - 这似乎是一个不错的REST接口?
我缺少的东西吗? 有没有更好的办法来确定资源是否存在REST风格,还是应该HTTP也许被更新,以表明不一定被认为是“错误”,非2xx状态码,并且只是信息? 如果浏览器能够被配置为使得它们并不总是输出非2xx状态响应作为JS控制台“错误”?
PS。 如果你读了这一步,谢谢。 ;-)