【问题标题】:What is an opaque response, and what purpose does it serve?什么是不透明响应,它的用途是什么?
【发布时间】:2016-07-17 11:52:27
【问题描述】:

我尝试fetch一个旧网站的网址,出现错误:

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'})

好的,它现在可以工作了……但我看不懂。 =\

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

【问题讨论】:

    标签: cors fetch-api


    【解决方案1】:

    考虑服务工作者充当不可知缓存的情况。您唯一的目标是提供与您从网络获得的资源相同的资源,但速度更快。当然,您不能确保所有资源都属于您的来源(例如,考虑从 CDN 提供的库)。由于 service worker 有可能改变网络响应,你需要保证你对响应的内容不感兴趣,也不关心响应的头部,甚至不关心结果。您只对作为黑盒的响应感兴趣,以便可能缓存它并更快地提供它。

    这就是 { mode: 'no-cors' } 的用途。

    【讨论】:

    • 但是Status code总是0,如果status is never 200如何判断是否成功?
    • 你不能。它是黑盒的一部分。
    【解决方案2】:

    JavaScript 无法访问不透明的响应,但您仍然可以使用 Cache API 缓存它们,并在服务工作者的 fetch 事件处理程序中使用它们进行响应。因此,它们对于使您的应用离线以及您无法控制的资源(例如,CDN 上未设置 CORS 标头的资源)非常有用。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        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;
        
        }
        

        【讨论】:

        • 和我觉得的问题完全无关
        猜你喜欢
        • 1970-01-01
        • 2010-09-27
        • 2011-12-17
        • 2010-11-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多