什么是不透明的响应,它有什么作用?


172

我尝试访问fetch旧网站的URL,并发生了错误:

Fetch API cannot load http://xyz.
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://abc' is therefore not allowed access.
If an opaque response serves your needs, set the request's mode to 'no-cors'
to fetch the resource with CORS disabled.

我理解了该消息,并尝试执行一个返回不透明响应的请求:

fetch("http://xyz", {'mode': 'no-cors'})

好的,现在可以了...但是我看不懂。= \

那么,不透明的响应的目的是什么?

Answers:


149

考虑服务工作者充当不可知的缓存的情况。您唯一的目标是提供与网络相同的资源,但是速度更快。当然,您不能确保所有资源都是您的来源的一部分(例如,考虑CDN提供的库)。由于服务人员有可能更改网络响应,因此您需要确保您对响应的内容,响应头,结果都不感兴趣。您只对响应感兴趣,因为它是一个黑匣子,可以缓存它并更快地提供它。

这就是{ mode: 'no-cors' }为了这个目的。


2
但是Status code始终是0,如何检查是否成功status is never 200
Angshuman Agarwal,

3
你不能。它是黑匣子的一部分。
萨尔瓦(Salva)'18年

67

JavaScript无法访问不透明的响应,但是您仍然可以使用Cache API对其进行缓存,并在fetchService Worker 中的事件处理程序中进行响应。因此,它们对于使您的应用程序脱机非常有用,对于您无法控制的资源(例如CDN上未设置CORS标头的资源)也很有用。


1

还有Node JS应用程序的解决方案。CORS Anywhere是一个NodeJS代理,它将CORS标头添加到代理请求中。

代理的URL实际上是从路径中获取,经过验证和代理的。代理URI的协议部分是可选的,默认为“ http”。如果指定了端口443,则协议默认为“ https”。

除了cookie之外,此程序包对http方法或标头没有任何限制。不允许请求用户凭据。可以将应用配置为要求标头来代理请求,例如,以避免浏览器直接访问。https://robwu.nl/cors-anywhere.html


-2

javascript在获取答案方面有些棘手,我通过从后端获取api,然后将其调用到前端来解决了这个问题。

public function get_typechange () {

    $ url = "https://........";
    $ json = file_get_contents ($url);
    $ data = json_decode ($ json, true);
    $ resp = json_encode ($data);
    $ error = json_last_error_msg ();
    return $ resp;

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.