【问题标题】:Get Header Request Javascript: cURL working, fetch forbidden获取标头请求 Javascript:cURL 工作,禁止获取
【发布时间】:2020-10-09 09:44:52
【问题描述】:

我想在 React 应用程序中获取请求此链接 https://soundcloud.app.goo.gl/u6XXuqp3Q7Q7WXgH8 的标题。当做一个简单的请求时

 request('https://soundcloud.app.goo.gl/u6XXuqp3Q7Q7WXgH8', function (error, response, body) {
    console.error('error:', error); 
    console.log('body:', body);
        });

我明白了

Access to fetch at 'https://soundcloud.app.goo.gl/u6XXuqp3Q7Q7WXgH8' from 
origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-
Control-Allow-Origin' header is present on the requested resource. If an 
opaque response serves your needs, set the request's mode to 'no-cors' to 
fetch the resource with CORS disabled.

使用 cors-anywhere 代理时

 request('https://cors-anywhere.herokuapp.com/https://soundcloud.app.goo.gl/u6XXuqp3Q7Q7WXgH8', function (error, response, body) {
    console.error('error:', error); 
    console.log('body:', body);
     });

我明白了

request.js:150 GET https://cors-anywhere.herokuapp.com/https://soundcloud.app.goo.gl/u6XXuqp3Q7Q7WXgH8 403 (Forbidden)

但是当我只是 cURL 时,我得到了正确的响应

curl -s -o /dev/null -D -  https://soundcloud.app.goo.gl/u6XXuqp3Q7Q7WXgH8 

谁能向我解释这种行为并告诉我如何克服这个问题?

谢谢!

【问题讨论】:

  • 您在此处遇到 CORS 问题,您的客户端域需要在服务器中列入白名单,或者,如果已经列入,则需要更正请求标头。
  • 重点是,我无权访问 soundcloud 服务器。并且使用 cors-anywhere 代理适用于除 soundcloud 链接之外的所有其他网站:(
  • 我还使用“cors”模块在快速服务器上运行了该应用程序,但没有任何效果:(

标签: javascript node.js reactjs get request


【解决方案1】:

当您尝试直接从浏览器调用 API 并且该 API 不允许任何其他网站获取数据时,通常会出现 CORS 错误。

目前我能想到的这个问题有两种解决方法 -

  1. 要么从后端代码调用该 API,然后在后端收集从网站接收到的数据,然后在客户端传输数据。基本上,您将包装原始 API。
  2. 您可以使用 NGINX 之类的 Web 服务器,并在域上配置指向外部 API 的特定路径以及指向项目的其他路径。这将有助于在同一个域名上制作 External API 和 Your React 代码。

您的主要目标是让该外部 API 与您的反应代码一起在您的域中工作。

【讨论】:

  • 是的,你是对的......我只是认为可能会有解决方案,例如不会被任何 cors 东西阻止的特殊类型的 api 请求......
【解决方案2】:

在浏览器上下文 JS 中,例如在对 API 的 fetch 调用中,CORS 适用。而对于 CURL 请求,您实际上是在运行服务器端上下文,因此 CORS 不适用。这就是为什么您可以从服务器上下文或 node.js 上下文中访问 instagrams 非官方 api,但不能从浏览器中的同一个 fetch 调用中访问。可能的解决方案:

  1. 服务器设置的 Allow-Content-Orgin 标头必须包含您的页面所在的域。
  2. 将 Eletron 或 NodeWebkit.js 用于运行客户端的可视化应用程序,使用浏览器 (chromium) 启动您的应用程序(浏览器和服务器上下文的混合,CORS 不适用)
  3. 运行 node.js 应用程序(无浏览器、服务器上下文)并从终端运行您的应用程序。 (CORS 不适用)

【讨论】:

    猜你喜欢
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2011-09-14
    相关资源
    最近更新 更多