Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么';检查客户端是否可以访问资源的RESTful方法是什么?_Javascript_Http_Rest_Google Chrome_Firebug - Fatal编程技术网

Javascript 什么';检查客户端是否可以访问资源的RESTful方法是什么?

Javascript 什么';检查客户端是否可以访问资源的RESTful方法是什么?,javascript,http,rest,google-chrome,firebug,Javascript,Http,Rest,Google Chrome,Firebug,我试图确定RESTAPI中用于确定客户端是否可以访问特定资源的最佳实践。两个快速示例场景: 电话簿查询服务。客户端通过访问来查找电话号码,例如 GEThttp://host/directoryEntries/numbers/12345 ... 其中12345是要尝试在目录中查找的电话号码。如果它存在,它将返回诸如其电话号码所在的人的姓名和地址之类的信息 视频格式转换服务。客户将一种格式的视频提交给,例如 POSThttp://host/videos/ ... 并接收服务器为此视频生成的“视频GU

我试图确定RESTAPI中用于确定客户端是否可以访问特定资源的最佳实践。两个快速示例场景:

电话簿查询服务。客户端通过访问来查找电话号码,例如
GEThttp://host/directoryEntries/numbers/12345

... 其中
12345
是要尝试在目录中查找的电话号码。如果它存在,它将返回诸如其电话号码所在的人的姓名和地址之类的信息

视频格式转换服务。客户将一种格式的视频提交给,例如
POSThttp://host/videos/

... 并接收服务器为此视频生成的“视频GUID”。然后客户检查,例如
GEThttp://host/videos/[GUID]/flv

... 要获取视频,请将其转换为FLV格式(如果已转换版本存在)

您会注意到,在上述两种情况下,我都没有提到如果要检查的资源不存在会发生什么。这是我的问题。我已经读到,客户端检查资源是否存在的正确RESTful方法是调用资源上的
HEAD
(或者
GET
),如果资源不存在,它应该期望404响应。这很好,除了404响应被广泛认为是“错误”之外;声明4xx类状态代码适用于客户“似乎出错”的情况。但是等待;在这些例子中,客户肯定没有犯错。它希望它可以返回404(或其他;如果它没有授权访问此资源,则可能返回403),并且在请求资源时没有犯任何错误。404并不是用来表示“错误条件”,它只是一个信息——“这不存在”

正如HTTP规范所建议的,浏览器的行为就像404响应是一个真正的错误。每次XHR请求接收到404时,Google Chrome和Firebug的控制台都会向Javascript控制台发出一条红色的“404 Not Found”错误消息,不管它是否由错误处理程序处理,而且无法禁用它。这对用户来说不是问题,因为他们看不到控制台,但作为一名开发人员,我不想在JS控制台中看到大量404(或403等)错误,因为我非常清楚这些错误不是错误,而是由Javascript代码处理的信息。这是线路噪音。在我给出的第二个示例中,这是一个极端的行噪声,因为客户机可能正在轮询服务器以获取该
/flv
,因为编译可能需要一段时间,客户机希望显示“尚未编译”,直到获得非404。JS控制台中可能每隔一两秒就会出现404错误

那么,这是我们用REST检查资源存在的最好或最合适的方法吗?我们如何在JS控制台中避开线路噪音?在我的第二个示例中,很可能会建议查询不同的URI以检查编译状态,如:
GEThttp://host/videos/[GUID]/compileStatus

... 然而,在我看来,这似乎有点违反了休息原则;您没有完全使用HTTP并注意HTTP头,而是创建了自己的协议,通过该协议,您可以在正文中返回信息,告诉您想要知道的内容,并始终返回HTTP 200以关闭浏览器。这是对SOAP的主要批评——它试图“绕过”HTTP,而不是充分利用它。根据这个原则,为什么需要返回404状态码?您总是可以返回200-当然,200表示资源的状态信息可用,状态信息告诉您您真正想知道的-资源未找到。当然,RESTful方法应该是返回404状态码

如果我们把这个机制应用到我上面的第一个例子中,它看起来更加做作;客户可能会询问:
GEThttp://host/directoryEntries/numberStatuses/12345

... 当然还可以得到200英镑;号码
12345
的状态信息存在,并告诉您。。。在目录中找不到该号码。这意味着任何查询的数字都是“200 OK”,即使它可能不存在——这看起来像一个好的REST接口吗

我错过什么了吗?是否有更好的方法来确定资源是否以REST方式存在,或者是否应该更新HTTP以指示非2xx状态代码不一定被视为“错误”,而只是信息?浏览器是否应该能够进行配置,以便它们不会总是在JS控制台中将非2xx状态响应作为“错误”输出


附言:如果你读到这里,谢谢

我只见过GET/HEAD请求在资源不存在时返回404(未找到)。我认为,如果您只是试图获取资源的状态,那么head请求就可以了,因为它不应该返回资源的主体。通过这种方式,您可以区分尝试检索资源的请求和尝试检查其存在性的请求


编辑:我记得读过一篇关于替代解决方案的文章,在原始请求中添加了一个标题,指示服务器应该如何处理404错误。类似于200的响应,但是一个空的主体。

我认为您已经更改了请求的语义。 使用RESTful体系结构,您正在请求一个资源。因此,请求不存在或未找到的资源被视为错误

我使用:

  • 404如果
    GEThttp://host/directoryEntries/numbers/12345
    不存在

  • 400实际上是一个错误请求
    400错误请求

202 Accepted Location: http://tasks.example.com/video/task45543