将 React.js 中的 GET 请求发送到服务器

Posted

技术标签:

【中文标题】将 React.js 中的 GET 请求发送到服务器【英文标题】:GET request in React.js to a server 【发布时间】:2017-10-19 06:51:43 【问题描述】:

我有一个SearchBar 和一个Profile 组件,我想向服务器发出一个GET 请求:http://awesomeserver/users。服务器中的数据位于对象数组中。我希望能够在搜索栏中输入用户名,当我单击“搜索”时,我想在页面上显示该用户的名字、姓氏和电子邮件。例如,当我搜索 jsmith 时,我想显示:名字:John,姓氏:Smith,电子邮件:jsmith@gmail.com。为此,我需要将它们作为props 传递给Profile 组件。我正在使用 axios 发出请求,但我认为我没有正确使用它。如何按用户名搜索,但只检索名字、姓氏和电子邮件?

这是示例数据在服务器中的样子:


  username: jsmith,
  firstName: John,
  lastName: Smith,
  email: jsmith@gmail.com,
  hobby: hiking,
  id: 1

这是我目前的代码:

//Profile Component

import React,  Component  from 'react';


class Profile extends Component 
  render() 
    return (
        <div>
            <div>First Name: this.props.firstName</div>
            <div>Last Name: this.props.lastName</div>
            <div>Email: this.props.email</div>
        </div>
    );
  


export default Profile;



//SearchBar component

import React,  Component  from 'react';
import axios from 'axios';

import Profile from './Profile';

class SearchBar extends Component 

  constructor(props) 
  super(props);
  this.state = 
    fetchUser: 
      username: '',
      firstName: '',
      lastName: '',
      email: '',
      hobby: ''
    
  
  this.fetchUser = this.fetchUser.bind(this);



 fetchUser() 
    var id = this.refs.id.value;

    axios.get('http://awesomeserver/users/$id')
      .then(resp => resp.json()) 
      .then( (response) => 
        console.log(response);
        this.setState(
          fetchUser: response.data
        );
      )
      .catch( (error) => 
        console.log(error);
      );  
  

  render() 
    return (
      <div>
          <input ref="id" placeholder="Enter in a username" />
          <button onClick=this.fetchUser>Search</button>
          <Profile firstName=this.fetchUser.firstName lastName=this.fetchUser.lastName email=this.fetchUser.email />
      </div>
    );
  


export default SearchBar;

【问题讨论】:

【参考方案1】:

您在单击搜索按钮时调用fetchUsers 函数,因此不是返回响应,而是使用setState 设置状态变量中的数据,当您执行setState 时,react 将重新渲染组件,它会将配置文件数据传递给 Profile 组件。

像这样编写 SearchBar 组件:

class SearchBar extends Component 

  constructor()
      super();
      this.state = 
          profileDetails: 
      
      this.fetchUser = this.fetchUser.bind(this);
  

  fetchUser() 
      axios.get('http://awesomeserver/users.username')
      .then((response) => 
          this.setState(profileDetails: response.data)
      )
      .catch((error) => 
          console.log(error);
      );
  

   render() 
      return (
         <div>
             <input placeholder="Enter in a username" />
             <button onClick=this.fetchUser>Search</button>
             <Profile ...this.state.profileDetails />
         </div>
      );
   

查看DOC 了解有关...的详细信息。

【讨论】:

遇到任何问题?【参考方案2】:

你可以这样发出 axios 请求。 Axios 结果是异步的,它不会从函数返回结果,所以this.fetchUsers.firstName 等是没有意义的。调用函数并将结果保存在 axios 回调中的状态中,如

class SearchBar extends Component 
  state = 
        firstName: '',
        lastName: '',
        email: ''
  
  fetchUser = () => 
      axios.get('http://awesomeserver/users.username')
            .then(res => 
                 return res.json()
            ).then(response => 
                  this.setState(firstName: response.firstName, lastName: response.lastName, email: response.email)
             )
  

  render() 
    return (
      <div>
          <input placeholder="Enter in a username" />
          <button onClick=this.fetchUser>Search</button>
          <Profile firstName=this.state.firstName lastName=this.state.lastName email=this.state.email />
      </div>
    );
  


export default SearchBar;

【讨论】:

【参考方案3】:

这里你使用axios的方式不对,我们需要正确设置props的返回值,还需要正确绑定axios回调函数,比如你的代码应该是这样的:

import React,  Component  from 'react';


class Profile extends Component 
  render() 
    return (
        <div>
            <div>First Name: this.props.firstName</div>
            <div>Last Name: this.props.lastName</div>
            <div>Email: this.props.email</div>
        </div>
    );
  


export default Profile;



//SearchBar component

import React,  Component  from 'react';
import axios from 'axios';

import Profile from './Profile';

class SearchBar extends Component 
  constructor(props) 
    super(props);
    this.state = 
      fetchUser: 
        username: '',
        firstName: '',
        lastName: '',
        email: '',
        hobby: ''
      
    
    this.fetchUser = this.fetchUser.bind(this);
  

  fetchUser() 
    axios.get('http://awesomeserver/users.username')
      .then( (response) => 
        console.log("response", response);
        this.setState(
          fetchUser: response.data
        );
        console.log("fetchUser", this.state.fetchUser);
      )
      .catch( (error) => 
        console.log(error);
      );  
  

  render() 
    return (
      <div>
          <input placeholder="Enter in a username" />
          <button onClick=this.fetchUser>Search</button>
          <Profile firstName=this.state.fetchUser.firstName lastName=this.state.fetchUser.lastName email=this.state.fetchUser.email />
      </div>
    );
  


export default SearchBar;  

还请检查控制台中的response,以确保您获得了正确的对象。如果有任何错误,请在此处发布控制台的一些错误,谢谢!

【讨论】:

我尝试了您的解决方案,response 是一个对象,而 data 属性是对象数组。这是有效的,但是当我尝试进行搜索时,我收到了 404 的错误消息。仅当我尝试搜索 John Smith、Jane Doe 等姓名时才会发生这种情况。此外,我无法检索到正确的数据,例如名字和姓氏。是不是因为response 不是对象数组?如何仅检索与搜索栏对应的用户名数据? 刚刚把axios回调改了一点,请重试!好像第一个“.then()”会返回http响应对象,那么我们应该先将它转换成json。但是,您是否在控制台、响应对象或其他错误上看到了什么? 如果响应是带有数据键的对象,请使用“response.data”。关于你的搜索返回404,表示你的api找不到,或者你可以升级你的api,如果用户尝试搜索一些不存在的名字,你应该返回虚拟数据,或者返回“has_data:false”(添加到 json 结果) 我刚刚意识到该对象有 id,我应该按 id 而不是名称搜索。我没有得到404 错误。我很抱歉让你感到困惑。至于响应对象,我确实得到了一个不同的错误。这是错误:TypeError: resp.json is not a function。我什至尝试将其更改为 resp.data.json() 并得到相同的错误,除了它是 resp.data.json is not a function。你知道是什么原因造成的吗?此外,我更新了原始帖子中的代码以匹配所做的所有更改。 好的,如果 API 现在返回正常,请改回我以前的版本,但将“response.data”绑定到我们的“fetchUser”(请参阅​​上面我修改后的答案)。如果它仍然不起作用,请随时向我展示“响应”和“this.state.fetchUser”真正返回的内容(我使用 console.log 捕获它们)

以上是关于将 React.js 中的 GET 请求发送到服务器的主要内容,如果未能解决你的问题,请参考以下文章

Get 自定义 Jquery 数据表 GET 将发送到服务器的请求参数

React js 和 axios POST 请求发送空数组

react中如何通过axios get方法发送参数?

postman---postman发送请求

WEB中的GET和POST

AJAX 的GET和POST方法(向服务器发送请求)