【问题标题】:How to hit open source api [duplicate]如何打开源api [重复]
【发布时间】:2020-04-22 06:07:43
【问题描述】:

我正在使用 react 在组件内部我有一个按钮,单击该按钮我正在运行一个 API https://dog.ceo/api/breeds/list/all 这个来自 Dog.ceo 以获取所有品种的狗,但每次我点击这个网址时都会显示网络错误,我现在完全受够了,不知道我的代码中缺少什么

import React, { Component } from 'react'
import axios from 'axios'

 class Welcome extends Component {

    clickBtn(){

        axios.get(`https://dog.ceo/api/breeds/list/all`)
        .then((res)=>{
            debugger
            console.log(res)
        })
        .catch(err=>console.log(err))

    }

    render() {
        return (
            <div>
                <button
                onClick={this.clickBtn}
                className="btn btn-primary">Click</button>
            </div>
        )
    }
}
export default Welcome

我在代码沙箱中编写的相同代码然后它返回正确的响应那么为什么我需要在我的代码中引入一些东西?

this is code sandbox

【问题讨论】:

  • 你了解 CORS 是什么吗?您是否尝试过研究错误消息?您将无法通过跨域 ajax 请求访问此资源,除非更改远程 API 以允许您这样做(例如,某些 API 提供程序有一个注册程序,您可以在其中注册您的站点以获得允许的访问权限,或者也许还有另一种方式可以联系维护者)。您的代码没有明显的问题,它只是一个标准的安全功能。如果您对此一无所知,请在线搜索“CORS”。
  • 您的产品在 http 上运行并且您想从 https 获取数据!您必须将产品更改为 https 或从 http 获取
  • @ADyson 是的,我在传递链接时通过了Access-Control-Allow-Origin
  • P.S.解决方法是将 AJAX 请求发送到您自己的服务器,然后让您的服务器向 API 发出另一个请求(因此,发送到 API 的请求是标准 HTTP 请求,而不是跨域 AJAX 请求,并且所以不会被浏览器的政策阻止)。显然它的效率较低,但如果 API 维护者无法解决它,它可以解决安全问题。
  • "我在传递链接时通过了 Access-Control-Allow-Origin"...你到底是什么意思?这是一个标头,如果远程服务器想要允许 CORS 请求,它可以包含在其响应中(尽管它本身通常还不够,还需要其他步骤)。这不是您从客户端控制的东西。无论如何,我实际上无法看到您在代码中使用它的位置。但是...如果您在 JavaScript 代码中的某个地方使用过它,那它就毫无意义,并且尝试在请求端使用它向我表明您没有正确理解 CORS 的工作原理。

标签: javascript reactjs cors axios


【解决方案1】:

您“成功”地在 api 上发出请求,但是,它被阻止,因为您正在执行跨源请求(您可以查看这意味着什么 here)。基本上,API 不允许您的网站执行来自不同来源的请求。

避免这种情况的一种方法是让您的网站向您自己的 API 发出请求。然后您自己的 API 会向外部 API 发出请求,然后将获得的响应返回给您的网站。

【讨论】:

  • 我如何从后端调用给定的 API,因为 axios 是用于前端的
  • 确实,axios 是前端。您需要构建自己的后端来执行类似的操作。所以最后,你会有以下请求链:frontend (using axios)-&gt; your new backend-&gt; the API that you're interested in
【解决方案2】:

您收到 COR 错误。当您使用来自另一个域的 API 时,这是一个经典问题。如果您是此另一个 API 的开发者,您可以将 Access-Control-Allow-Origin: '*' 标头添加到 API 响应中,否则您可以在与调用此第三方 API 的前端相同的域上开发一个 API。

更多关于 COR 的信息here

【讨论】:

  • 我该怎么做develop API on the same domain
  • Ofc 这是一种锻炼,因为您绕过了跨域限制,但您可以开发一个 API 并在某处发布。如果它在你的前端的同一个域上,你不需要担心 COR,但是如果你在另一个地方发布,浏览器仍然会抱怨缺少 header 并阻止请求。在前端,您调用您的 API,而在您在后端公开的路由中,您调用第三方 API 并将结果返回给
猜你喜欢
  • 2020-02-22
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多