【问题标题】:React / Axios: fetch API data with key for CoinMarketCapReact / Axios:使用 CoinMarketCap 的密钥获取 API 数据
【发布时间】:2020-07-19 04:56:01
【问题描述】:

在这里没有编程经验...我一直在阅读一些关于此的问题,但无法正确解决。 我将 React 用于一个小型应用程序,并希望从 API 获取数据,在本例中为 Coinmarketcap,但它需要一个密钥,并且不知道如何通过 axios 传递它。 使用 Postman 发出测试请求,它工作正常。

这是 API 接收请求的方式(Node.js 示例):

const rp = require('request-promise');
const requestOptions = {
  method: 'GET',
  uri: 'https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest',
  qs: {
    'start': '1',
    'limit': '5000',
    'convert': 'USD'
  },
  headers: {
    'X-CMC_PRO_API_KEY': 'b54bcf4d-1bca-4e8e-9a24-22ff2c3d462c'
  },
  json: true,
  gzip: true
};

rp(requestOptions).then(response => {
  console.log('API call response:', response);
}).catch((err) => {
  console.log('API call error:', err.message);
});

这是我的 React 文件的代码:

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

class Prices extends Component {

    state = {
        cryptos: []
    }

    componenDidMount() {

        axios.get('https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest', {
            headers: { 'X-CMC_PRO_API_KEY': 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' }
        })
        .then(res => {
            console.log(res)
            this.setState({
                cryptos: res.data.slice(0,50)
            })
        });
    }
    render() {
        return(
            <div>asdf</div>
        )
    }
}

export default Prices

显然,我把钥匙藏在那里了。

  1. 应用程序运行正常
  2. 没有明显的错误,但也...
  3. 没有登录控制台

问题不在于我做错了什么,而在于……

在此先感谢您对我的帮助。

编辑: 父文件代码

import Layout from '../components/Layout'
import Prices from '../components/prices'
import axios from 'axios'

const Index = (props) => (
    <Layout>
        <div className="container">
            <h1>Welcome to CoinInfo</h1>
            <p>Check current Bitcoin rates</p>
            <Prices />
        </div>
    </Layout>
)

export default Index

【问题讨论】:

  • 您可以使用 .catch,查看您在 axios resquest 上遇到的错误。 axios.get('https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest', { headers: { 'X-CMC_PRO_API_KEY': 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' } }) .then(res =&gt; { console.log(res) this.setState({ cryptos: res.data.slice(0,50) }) }).catch(e =&gt; console.log(e))
  • 谢谢,不知道!仍然没有日志:奇怪:

标签: reactjs api axios key coinmarketcap


【解决方案1】:

您的请求中缺少query string 参数,并且还有一个错字。它是componentDidMount,组件中缺少t

请尝试以下代码。

import React, { Component } from 'react'
import axios from 'axios'
class Prices extends Component {
    state = {
        cryptos: []
    }

    componentDidMount() {
       this.fetchData();
    }

    async fetchData() {
        let qs = `?start=1&limit=5000&convert=USD`
        try {
            let res = await axios.get('https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest' + qs, {
                headers: { 'X-CMC_PRO_API_KEY': 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' }
            });
            console.log(res)
            this.setState({
                cryptos: res.data.slice(0, 50)
            });
        } catch (error) {
            console.log(error);
        }

    }
    render() {
        return (
            <div>asdf</div>
        )
    }
}
export default Prices

【讨论】:

    【解决方案2】:

    根据 CoinMarketCap 的文档

    目前通过 CORS 配置禁止使用 Javascript 在客户端发出 HTTP 请求。这是为了保护您的应用程序用户不应该看到的 API 密钥,这样您的 API 密钥就不会被盗。通过您自己的后端服务路由调用来保护您的 API 密钥。

    这意味着,他们不希望您从浏览器或客户端进行直接 API 调用。相反,他们会告诉您调用后端服务,该服务将您的用户 ID 与密钥进行映射,并对 coinMarketCap 网站进行中间调用

    例如,您可以在从客户端调用的节点服务器中公开一个 API,在该 API 调用中,节点服务器将调用 coinMarketBase API 并返回结果

    【讨论】:

    • 感谢您的回复。是的,这确实是我现在的问题之一。这是一个错字!对于任何感兴趣的本地环境,您可以在 API URI 之前使用它:cors-anywhere.herokuapp.com
    猜你喜欢
    • 2021-06-25
    • 2018-01-31
    • 2021-12-03
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2022-01-04
    • 2023-02-02
    • 2020-09-10
    相关资源
    最近更新 更多