在 React 组件中从 Behance API 加载数据

Posted

技术标签:

【中文标题】在 React 组件中从 Behance API 加载数据【英文标题】:Loading Data from Behance API in React Component 【发布时间】:2017-09-30 10:25:26 【问题描述】:

我正在尝试通过他们的 API 加载 Behance 项目数据。无论是 localhost 还是 prod,我都会收到以下错误 -

Fetch API 无法加载 XXX。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'http://localhost:5000' 不允许访问。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。

不知道如何解决这个问题。 我在下面 Portfolio 组件中的代码 --

getPortfolio = () => 

const USER_ID = `XXX`,
      PROJECT_ID = `XXX`,
      API_KEY = `XXX`;

const BEHANCE_URL = `https://api.behance.net/v2/users/$USER_ID/projects?client_id=$API_KEY`;
console.log(BEHANCE_URL);

fetch(BEHANCE_URL, 
  method: 'get',
  dataType: 'jsonp',
  headers: 
      'Accept': 'application/json',
      'Content-Type': 'application/json'
  
).then((response) => 
  return response.json();
).then((responseData) => 
  return responseData;
).catch((err) => 
  return err;
);


更新:使用 jQuery ajax 代替获取。 --

$.ajax(
  url: BEHANCE_URL,
  type: "get",
  data: projects: ,
  dataType: "jsonp"
).done((response) => 
  this.setState(
    portfolioData: response['projects']
  );
).fail((error) => 
  console.log("Ajax request fails")
  console.log(error);
);

【问题讨论】:

你知道为什么使用 jquery 它不会抛出 CORS 错误吗?因为不应该是这样。看看这个,***.com/questions/25923796/cors-error-with-jquery。我很想知道 jquery 是如何代替 fetch 工作的。 我刚刚在一个项目中实现了它,它确实足够有效。我听说使用fetch()jQuery,您可以规避CORS 错误,而且显然可以。 【参考方案1】:

这似乎用 React 做的更少,而用 Behance 做的更多。你得到的是CORS error,你可能已经猜到了。简短的解释是,CORS 是一种放在浏览器上的安全措施,因此网站无法从浏览器请求其他网站看起来是第二个网站。这是一种安全措施,可以防止某些网络钓鱼攻击。

服务器(在本例中为 Behance)可以禁用 CORS,但出于正当理由他们决定不这样做。

Behance 可能会允许您改为从服务器发出您尝试发出的请求。一旦你这样做了,你将需要从你的服务器获取信息到你的 React 应用程序,然后你就可以开始了!

【讨论】:

奇怪的是,引入 jQuery 并做一个 $.ajax 可以拉取数据 你的意思是使用 jQuery 而不是 Fetch?这确实很奇怪。 是的,这行得通 -- $.ajax( url: BEHANCE_URL, type: "get", data: projects: , dataType: "jsonp" ).done((response ) => this.setState( portfolioData: response['projects'] ); ).fail((error) => console.log("Ajax 请求失败") console.log(error); ) ;

以上是关于在 React 组件中从 Behance API 加载数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React 中从另一个组件设置一个组件的状态

如何在 TypeScript v2.x 中从自定义 React 组件公开“通用”事件

无法在 React 中从我的 API 服务器获取数据

react中从类重构为功能钩子组件

在 React-redux 和 Redux-Thunk 中从 API 获取数据的问题

在 useEffect() 钩子中从父级传递的子级调用函数,React