什么是不透明的回应,它的目的是什么?

时间:2016-03-29 18:41:22

标签: cors fetch-api

我尝试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'})

好的,它现在有效......但我无法阅读它。 = \

不透明回应的目的是什么?

4 个答案:

答案 0 :(得分:128)

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

这是{ mode: 'no-cors' }的目的。

答案 1 :(得分:61)

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

答案 2 :(得分:2)

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

代理的url字面上取自路径,验证和代理。代理URI的协议部分是可选的,默认为" http"。如果指定了端口443,则协议默认为" https"。

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

答案 3 :(得分:-3)

javascript很难得到答案,我通过从后端获取api然后将其调用到前端来解决了这个问题。

app.use(function (req, res, next) {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type,x-auth-token');
  res.setHeader('Access-Control-Allow-Credentials', true);
  res.setHeader('Access-Control-Expose-Headers', 'x-auth-token');
  if (req.method === "OPTIONS") {
    res.sendStatus(200);
  } else {
    next();
  }
});