在 React 中进行 API 调用

Posted

技术标签:

【中文标题】在 React 中进行 API 调用【英文标题】:Making an API call in React 【发布时间】:2018-07-31 05:43:46 【问题描述】:

我正在尝试以返回 JSON 数据,但我对如何执行此操作有点困惑。我的 API 代码在 API.js 文件中,如下所示:

import mockRequests from './requests.json'

export const getRequestsSync = () => mockRequests

export const getRequests = () =>
new Promise((resolve, reject) => 
setTimeout(() => resolve(mockRequests), 500)
)

它正在检索格式如下的 JSON 数据:


"id": 1,
"title": "Request from Nancy",
"updated_at": "2015-08-15 12:27:01 -0600",
"created_at": "2015-08-12 08:27:01 -0600",
"status": "Denied"
 

目前我进行 API 调用的代码如下所示:

import React from 'react'

const API = './Api.js'

const Requests = () => ''

export default Requests

我查看了几个示例,但仍然对如何进行此操作感到有些困惑。如果有人能指出我正确的方向,将不胜感激。

编辑:在我见过的大多数示例中, fetch 看起来是最好的方法,尽管我在语法上苦苦挣扎

【问题讨论】:

【参考方案1】:

你会想做这样的事情:

var url = 'https://myAPI.example.com/myData';
fetch(url).then((response) => response.json())
          .then(function(data)  /* do stuff with your JSON data */)
          .catch((error) => console.log(error));

Mozilla 有关于使用 fetch here 的非常好的文档,我强烈建议您阅读。

第二个.then 中的data 参数将是从您获得的JSON 响应中解析的对象,您可以通过使用JSON 中的属性标签来访问其属性。例如data.title 将是"Request from Nancy"

【讨论】:

您能否举一个示例,说明您的 JSON 数据区域的内容是什么? SakoBu 的回答就是一个很好的例子。在他们的代码中,第二个 .then 回调将 JSON 对象映射到组件的状态(该变量称为 response 而不是 data,但它是相同的)。基本上,您通常会将数据分配给具有更大范围的另一个变量,或者调用函数将数据保存在某处。 但是如果我不在 Didmount 中编写 api 调用怎么办。如果我有特殊的操作页面,如何使用加载器。我也不想使用调度发送一个标志来停止加载程序。我正在寻找的是一旦我得到 api 的响应就停止加载器【参考方案2】:

这是一个使用实时 API (https://randomuser.me/) 的简单示例...它返回一个对象数组,如您的示例中所示:

import React from 'react';

class App extends React.Component 
  state =  people: [], isLoading: true, error: null ;

  async componentDidMount() 
    try 
      const response = await fetch('https://randomuser.me/api/');
      const data = await response.json();
      this.setState( people: data.results, isLoading: false );

     catch (error) 
      this.setState( error: error.message, isLoading: false );
    
  

  renderPerson = () => 
    const  people, isLoading, error  = this.state;

    if (error) 
      return <div>error</div>;
    

    if (isLoading) 
      return <div>Loading...</div>;
    

    return people.map(person => (
      <div key=person.id.value>
        <img src=person.picture.medium  />
        <p>First Name: person.name.first</p>
        <p> Last Name: person.name.last</p>
      </div>
    ));
  ;

  render() 
    return <div>this.renderPerson()</div>;
  


export default App;

这有意义吗?应该很直截了当...

现场演示:https://jsfiddle.net/o2gwap6b/

【讨论】:

谢谢,这真的帮助我掌握了整个事情 我仍在苦苦挣扎的一件事是从本地文件中获取,在本例中为 Api.js,如我原来的帖子所示,如果我将获取更改为“.Api.js”或'./requests.json' 我收到一条错误消息,指出位置 0 处的 JSON 中的意外令牌 这不是问题所在,我无法从您的代码中真正看出...也许用完整代码制作一个 github 存储库并在此处发布链接... 但是如果我不在 Didmount 中编写 api 调用怎么办。如果我有特殊的操作页面,如何使用加载器。我也不想使用调度发送一个标志来停止加载程序。我正在寻找的是一旦我得到 api 的响应就停止加载器【参考方案3】:

如果您在使用 fetch 时遇到困难,Axios 有一个更简单的 API 可供使用。

在你的 API.js 文件中试试这个(当然先用npm i --save axios安装axios):

import axios from 'axios'
import mockRequests from './requests.json'

export const getRequests = (url) => 
  if (url) 
    return axios.get(url).then(res => res.data)
  

  return new Promise((resolve, reject) =>  // you need to return the promise
    setTimeout(() => resolve(mockRequests), 500)
  )
)

在您的组件中,您可以像这样访问getRequests 函数

import React,  Component  from 'react'
import  getRequests  from './API.js'

class App extends Component 
  state =  
    data: null
  

  componentWillMount() 
    getRequests('http://somedomain.com/coolstuff.json').then(data => 
      console.log(data)
      this.setState( data )
    )
  

  render() 
    if (!this.state.data) return null

    return (
      <div className='App'>
        this.state.data.title
      </div>
    )
  


export default App

【讨论】:

但是如果我不在 Didmount 中编写 api 调用怎么办。如果我有特殊的操作页面,如何使用加载器。我也不想使用调度发送一个标志来停止加载程序。我正在寻找的是一旦我得到 api 的响应就停止加载器

以上是关于在 React 中进行 API 调用的主要内容,如果未能解决你的问题,请参考以下文章

在 React 中以正确的方式进行同步 API 调用 [重复]

在 REACT 中进行 API 调用时动态设置目标

如何停止在 React 中重新渲染时进行 api 调用?

尝试使用 axios 在 React/Phoenix 应用程序中进行 API 调用(使用早午餐)

如何模拟在使用 Jest 测试的 React 组件中进行的 API 调用

React redux-observable:以史诗般的方式进行顺序 API 调用