【问题标题】:Access API JSON data in React在 React 中访问 API JSON 数据
【发布时间】:2019-04-26 11:40:13
【问题描述】:

我正在尝试通过使用 ip-api 来构建一个天气应用程序,以获取用户当前的纬度和经度,并将其传递到 darksky api URL 以获取天气 JSON 数据。我的 lat 和 lon 记录正常,但 Darksky 调用出现以下错误。我试图从一个 API 中提取数据并使用另一个 API 是否做错了什么?还是只是按照我尝试的方式?

-GET 'dark sky api url' 401

-CORS 政策已阻止从源“http://localhost:3000”获取“https://api.darksky....”的访问权限

getLocation = async (e) => {
  e.preventDefault();
  const api_call = await fetch("http://ip-api.com/json");
  const data = await api_call.json();
  console.log(data.lat, data.lon);
  let lattitude = data.lat;
  let longitude = data.lon;

  const weather_call = await fetch(`https://api.darksky.net/forecast/${API_KEY}/${lattitude},${longitude}`);
  const weather_data = await weather_call.json();
  console.log(weather_data);
}

  render() {
    const {to, getLocation, ...rest} = this.props;
      return (
        <div className="App">
          <Landing getLocation={this.getLocation}/>
        </div>
      );

  }

【问题讨论】:

  • 改成fetch('https://api.darksky...', { mode: 'no-cors' }) 还会报错吗

标签: javascript reactjs api geolocation


【解决方案1】:

为什么我在尝试调用 API 时收到错误 No 'Access-Control-Allow-Origin' header is present on the requested resource? 在 Dark Sky,我们非常重视安全。作为安全预防措施,我们已在服务器上禁用跨域资源共享 (CORS)。

您的 API 调用包含您的 API 密钥作为请求的一部分。如果您要从面向客户端的代码进行 API 调用,任何人都可以提取和使用您的 API 密钥,这将导致您必须支付账单。我们禁用 CORS 以帮助保护您的 API 密钥。

为防止 API 密钥滥用,您应该设置代理服务器以在后台调用我们的 API。然后,您可以在不暴露 API 密钥的情况下向客户提供预测。

你可以在这里搜索https://darksky.net/dev/docs/faq

【讨论】:

  • 我认为你应该在你的回答中澄清安全风险与 CORS 无关......只是你试图阻止开发人员将他们的 API 密钥嵌入到暴露的地方。如果正确使用,启用 CORS 是非常安全的。事实上,有些用例需要使用 CORS 请求访问您的 API。假设我想为您的服务创建一个客户端,用户输入他们自己的 API 密钥。通过禁用 CORS,必须代理数据,将它们的密钥暴露给我的服务器。也许这不是您关心的用例,但它是有效的。
  • 我同意,但在这种情况下,darksky 制定了这条规则。我只复制常见问题的信息。
  • 然后更新您的答案,而不是复制/粘贴。
【解决方案2】:

您的问题是您在前端公开了 API 密钥。您必须从后端拨打电话。

【讨论】:

    猜你喜欢
    • 2023-01-09
    • 2017-07-09
    • 2021-08-15
    • 1970-01-01
    • 2017-05-10
    • 2018-11-28
    • 2017-12-08
    • 1970-01-01
    • 2018-08-17
    相关资源
    最近更新 更多